1화 다른 컴퓨터를 리모트로 조작하고 싶어 (ssh)
SSH는 Secure Shell의 약어
다른 PC에 네트워크 경유로 로그인해서 자기 PC처럼 조작
통신 경로 암호화
X : 리눅스에서 화면 표시와 입력을 담당하는 구조 (화면? 을 의미하는듯)
명령어 : ssh 계정@네트워크명 or IP
2화 임시로 관리자 권한을 얻고 싶어 (sudo)
root : 관리자 권한을 가진 특별 사용자, 일반 관리자를 사용해야 함
명령어 : sudo 명령어
3화 다양한 문자열을 한 번에 검색하고 싶어 (grep)
파일 내용을 확인해서 찾는 문자열이 포함되었는지를 조사해주는 명령어
grep : global regular expression print (파일 전체에서 정규 표현식과 일치하는 위치를 출력하라)
정규표현식(Regular Expression) : 특수한 기호를 써서 검색하고 싶은 내용을 유연하게 표현하는 서식
() ------ 그룹화
| ------ 좌우 중 하나
? ------ 직전 표현이 0회 또는 1회 등장
* ------ 직전 표현이 0회 이상 연속해서 등장
+ ------ 직전 표현이 1회 이상 연속해서 등장
. ------ 임의의 한 문자
^ ------ 줄 머리
$ ------ 줄 끝
참고 사이트 : https://wikidocs.net/4308
명령어 : grep "문자열" /파일명
grep -r -i "문자열" /파일명
- -r : 서브 폴더까지 검색하도록 지정
- -i : 알파벳 대문자 소문자 차이 무시하고 검색 옵션
grep -v "문자열" : 지정한 문자열을 포함하지 않은 줄 출력
4화 터미널에서도 대화형으로 파일을 편집하고 싶어 (vim)
vim : 텍스트 에디터
커맨드(노멀) 모드 <-> 입력 모드
명령어 : vim /파일명
- 노멀 모드 전환 : 각 모드에서 esc
- 입력 모드 : 노멀모드에서 i
- 편집 저장 : 파일 편집 후 esc -> :wq
- 검색 : /검색하고 싶은 문자열
- 검색 후 이동 : n(next), shift+ n
- 정규표현식 사용 가능
5화 vim에서도 복사 & 붙이기 & 되돌리기를 하고 싶어 (yank)
ctrl + c,v 로 복사 붙여넣기 안됨
GNOME terminal : 데스크톱 환경에서 콘솔 환경을 들여다 보는 창
콘솔(CLI) 애플리케이션 vs GUI 애플리케이션 구분
- 데스크톱 환경은 기본적으로 전부 GUI
- GUI 앱 끼리는 복사 붙여 넣기 가능
- CLI 앱은 규칙이 다름
- terminal 혹은 콘솔 app 어디서 하는 조작 인지 구분해야함
- terminal에서 ctrl+c를 하면 terminal에서 표시한 내용을 복사한 것
- 해당 내용을 콘솔 app(vim)에서 ctrl+v를 하면 이를 텍스트자체(^C)로 붙여넣은 것
- 대신 vim에서 사용하는 클립보드를 이용해야함
vim에서의 복사 & 붙여넣기
- 시작 위치에서 v
- 커서로 범위 지정
- 마지막에서 y -> 클립보드에 텍스트가 복사된 상태
- shift+p (paste)
ctrl + z : 지금 실행중인 애플리케이션 일시 정지
- fg 로 복귀 가능(foreground)
되돌리기 : 노멀 모드에서 u
앞으로 되살리기 : 노멀모드에서 shift+r(redo)
6화 갑작스러운 네트워크 끊김에서 복귀하고 싶어 (가상터미널 : tmux)
GNOME terminal : 데스크톱 환경에서 콘솔 환경을 들여다 보는 창
가상 terminal : 콘솔 환경에서 GNOME terminal 과 같은 애플리케이션
가상 terminal 종류 : tmuix, screen, byobu(tmux가 제일 많이 쓰임)
설치 : sudo apt-get install tmux
- 자세한 조작법은 여기
- 실행 : tmux 입력
- 이어서하기 : tmux attach
- 빠져나오기 : ctrl+b (prefix key) 입력 후 d (약간 리듬 있게)
- 새로운 탭 열기 : ctrl+b c
- 다음 탭 : ctrl+b n
- 이전 탭 : ctrl+b p
7화 다른 화면도 보면서 작업하고 싶어 (화면 분할)
화면 분할
- 가로 분할 : ctrl+b "
- 세로 분할 : ctrl+b %
포커스는 새로운 화면에 가 있음
- 포커스 전환 : ctrl+b 화살표 키
- 화면 크기 변경 : ctrl+b ctrl+화살표 키
tmux에서의 화면 스크롤
- ctrl+b [ 후 마우스 휠로 스크롤
- 내용 확인 끝난 후 q or esc키
8화 최근 실행한 명령어를 호출하고 싶어 (명령어 이력)
셸(쉘) : 사용자가 콘솔 환경에서 대화식으로 명령어를 입력하면서 사용하는 SW
셸 종류 : bash, zsh, dash 등
명령어 이전 이후 검색 : 화살표 ↑ or ↓
vim ~/.bash_history에서 명령어 이력 기록
명령어 이력 검색
- 후방(이전) 검색 ctrl+r
- 역방향 검색(bash 설정 파일 수정)
- vim ~/.bashrc
- shift+g (파일 마지막으로 이동)
- stty stop undef 입력 후 콘솔 환경 재접속
- 설정 변경 후 전방(이후) 검색 ctrl+s
9화 오래전에 실행한 명령어를 호출하고 싶어 (명령어 이력 검색)
명령어 이력 저장 개수 수정이 필요
- vim ~/.bashrc
- shift+g (파일 끝으로 이동)
- export HISTSIZE=10000
export HISTFILESIZE=10000 추가 - :wq 저장 후 bash 재로그인
- export HISTSIZE=10000
터미널 마다 명령 히스토리 공유
- vim ~/.bashrc
- shift+g (파일 끝으로 이동)
- 다음 설정 추가
function share_history {
history -a
history -c
history -r
}
PROMPT_COMMAND='share_history'
shopt -u histappend
- .bash_history와 메모리 복사본을 자주 동기화
- 명령어를 실행할 떄마다 .bash_history와 메모리 명령어 이력 동기화
10화 네트워크를 건너서 파일을 복사하고 싶어 (scp)
SCP(Secure CoPy) : 네트워크를 통해서 파일을 복사하는 명령어(cp와 형식 거의 비슷함)
내 pc에서 다른 pc로 보내는 경우
- scp 파일명 계정@네트워크명 or IP:디렉토리
다른 pc에서 내 pc로 가져오는 경우
- scp 계정@네트워크명 or IP:디렉토리 내pc경로
- SSH 접속을 일단 종료하거나 GNOME 단말에서 새로운 탭을 열어서 실행하기
여러개 동시 복사
- /tmp/ 디렉토리에서 .txt로 끝나는 파일 전부 : scp 계정@네트워크명 or IP:디렉토리/tmp/*.txt 내pc경로
- /tmp/ 디렉토리 전체 복사 : scp -r 계정@네트워크명 or IP:디렉토리/tmp/ 내PC경로
PC1에서 다른 PC2로 파일 복사
- scp PC1계정@네트워크명 or IP/디렉토리/file명 PC2계정@네트워크명 or IP/디렉토리/
11화 시스템 과부하를 파악하고 싶어 (top)
시스템 부하 관련 정보를 수초 간격으로 실시간으로 갱신하면서 표시해주는 툴
부하 지표
- load average : CPU가 처리하는 걸 기다리는 작업 개수, 1분당 평균으로 몇개의 일이 쌓이는지 나타내는 값
코어의 수에 따라 load average 부하정도 파악해야함(쿼드코어의 경우 load average 4 이하가 안전한 상태) - %CPU : 해당 프로세스가 차지하는 CPU 사용율
- TIME+ : 실제로 CPU를 사용한 시간
%CPU가 높아도 TIME+가 짧은 경우 해당 프로세스를 수행시간은 짧고 휴식시간이 긴 형태이므로 실제 부하량은 낮음. 즉 CPU사용율 & CPU사용시간을 모두 파악해야함 - COMMAND : 프로세스를 실행했을 때 실행한 명령어 표시. c 입력시 상세 표시 전환
과부하 프로세스 파악 후 sudo kill PID1, PID2, ... 명령어로 해당 프로세스 종료
개인적으로는 htop 씀
12화 시스템 메모리 부족을 파악하고 싶어 (top 표시 전환)
CPU 부하량이 낮아도 load average가 높은 경우 : 디스크I/O
스왑(SWAP)
- CPU는 보통 작업 장소로 메인 메모리를 사용하지만 메모리 여유 공간이 부족하면 새로운 작업을 할 수 없음
- OS는 메모리에 있는 최근에 사용하지 않은 데이터를 정리해서 메모리에 여유 공간 생성
- 정리된 데이터를 하드디스크로 옮기는 것을 스왑 아웃
- 스왑아웃한 데이터가 필요해지면 하드디스크에서 메모리로 데이터를 되돌리는 것을 스왑 인
- 메모리 사용량이 늘수록 스왑이 빈번하게 발생해서 I/O대기시간이 길어짐
- 메모리 부족 때문에 load average 증가
필요할 때만 프로세스를 실행하는 것 vs 컴퓨터를 사용하는 동안 계속 프로세스를 실행하는 것
grep, vim, ssh ... vs apache, sshd ...
후자는 sudo service 서비스명 restart 와 같이 서비스 재시작 해야함(kill 하면 안됨)
%MEM
- 프로세스가 소비하는 메모리량
- 전체 메모리 중 해당 프로세스가 차지하는 %
top 표시 정렬
- 메모리 소비량 순 : shift+m
- CPU 시간 순 : shift+t
- CPU 사용량 순 : shift+p
13화 로그 파일에서 필요한 줄만 뽑고 싶어 (파이프라인 | )
| : 파이프 라인 (shift+\)
- 명령어 양쪽을 연결시킴
출력을 넘기는 명령어 | 출력을 받을 명령어 | 출력을 받을 명령어 | ...
- ex) grep '문자열' /파일명/ cat (파일 내용 보는 명령어)
오래된 로그파일은 디스크 용량을 줄이기 위해 압축 -> 압축파일은 grep으로 못봄
- 지정한 파일 출력 : cat
- 압축 파일을 풀어서 출력 :
- zcat(gzip,tgz 파일)
- xzcat(xz 파일)
- unzip(zip파일)
tail : 파일 내용 끝부분만 출력
- -F 옵션 지정시 파일 변경을 감시해서 내용이 추가될 때마다 실시간 출력
14화 작업 절차를 자동화하고 싶어 (셸 스크립트)
셸 스크립트 : 셸 작업을 자동화하도록 만든 각본
#!bin/bash : 셔뱅(shebang)
- 스크립트를 실행하는 프로그램을 지정
- bash용 스크립트구나~
- /user/bin/perl, /user/bin/ruby1.9.1 등 ...
셸로 실행하는 스크립트의 총칭
실행권한 주기
- chmod +x 파일명.sh
- 실행시 경로를 제대로 지정해야함 : ./file.sh -> /bin/ 이나 /usr/bin 같은 특별한 장소에 있을 때만 가능
스크립트 실행 도중 실패시 에러 처리
- if [ $? != 0 ]; then exit; fi
- 실패했을 때 그 뒤의 처리에 영향이 가는 명령어가 있을 때 사용
15화 같은 문자열을 스크립트에서 재사용하고 싶어 (셸 변수)
vim 에서 일괄 치환 : 노멀모드에서 %s/오타난 문자/바꿀 문자
반복적으로 사용하는 값을 변수로 선언 가능
- 변수명 = 명령어 or 값
- $변수명 으로 사용
옵션 조합 변수 할당 가능
#!/bin/bash
TAR_EXTRACT="tar xfv"
TAR_COMPRESS="tar cfv"
# 문자열을 eval 명령어에 넘기면 명령어열로 실행 가능
eval "$TAR_EXTRACT file.tar.gz"
eval "$TAR_COMPRESS directory"
스크립트는 각 줄이 80자 이내가 되도록 정리하는게 매너
16화 작업 환경과 상태를 정해서 스크립트를 실행하고 싶어 (환경 변수)
환경 변수 : 자기가 정의하자 않아도 $변수명 으로 값을 참조할 수 있는 특수한 변수
- 작업하는 서버에 따라 관리용 사용자 이름에 따라 다를 경우 실행하는 명령어가 조금 씩 달라질 때 사용 가능
HOME
- 해당 사용자의 홈 디렉토리 경로
- mkdir ${HOME}/dir : a 사용자 서버에서 /home/a/dir 디렉토리 생성
env : 지금 환경에서 쓸수있는 환경변수 목록
자주 쓰는 환경 변수
- HOME : 현재 사용자의 홈 디렉터리 경로
- PWD : 현재 디렉터리(작업 디렉터리) 경로
- EDITOR : 정해진 텍스트 에디터(vim, Emacs, nano 등) 경로
- PAGER : 정해진 페이저(less, lv 등) 경로
- USER : 현재 사용자의 사용자명
- GROUP : 현재 사용자의 그룹명
- HOSTNAME : 머신의 호스트명
명령어 치환
- $(명령어열) or '명령어열'
- result.txt 파일을 날짜별로 파일명을 변경할 경우
- mv result.txt result-$(date +%Y-%m-%d).txt 로 스크립트 작성시
-> result-yyyy-mm-dd 형식으로 생성 - 파이프라인이나 변수 등도 사용 가능
today = $(date +%Y-%m-%d)
mv result.txt result-${today}.txt
dirname
- 파일 이름에서 디렉토리 이름 뽑아내기
$(명령어열) vs '명령어열'
- '명령어'명령어'' 처럼 쓰면 가독성이 떨어지므로 $(명령어$(명령어)) 권장
- 호환성 때문에 ''가 남아있음
17화 로그 파일에서 필요한 줄만 뽑고 싶어 (cut)
cut : 파이프로 넘어온 내용의 각 줄마다 필요한 부분만 잘라내서 넘겨주는 명령어
구분자(delimiter) : 구분자를 이용해 필요한 정보를 구분
- --delimiter "구분자" or -d "구분자 로 사용
192.168.11.3 - - [11/Feb/2015:15:23:34 +0900] "GET /path/to/page HTTP/1.1" 200 13472 "-" "Mozilla/5.0
(Windows NT 6.0; rv:17.0) Gecko/20100101 Firefox/17.0"
- cut -d " " -f 7을 하면 공백(" ")로 파싱 후 7번 째 문자열 "/path/to/page" 추출
만약 구분자가 " 인 경우에는 ' 로 감싼다
- cut -d '"' -f 6
echo : 인수로 넘어온 문자열을 출력하기만 하는 명령어
- echo "$PWD" | cut -d "/" -f 2
- $PWD 값이 /var/log/apache2 하면 var 를 얻을 수 있음
18화 같은 내용의 줄을 세어보고 싶어 (sort와 uniq)
sort : 입력된 내용을 알파벳 순서로 재정렬하는 명령어
uniq : (이어진) 중복을 제거하는 명령어
- 연속되지 않은 경우 중복제거가 되지 않기 때문에 sort와 함께 사용
- --count, -c 옵션 : unique 실행 결과에 각각 내용이 몇번 등장했는가 출력
access log에서 같은 url 호출 횟수
- cat /var/log/apache2/access.log | grep -v "/live" | cut -d " " -f 7 | sort | uniq -c | less
중복 횟수 순으로 내림 차순 : sort 는 기본이 오름차순, -r 옵션 : 내림차순
- cat /var/log/apache2/access.log | grep -v "/live" | cut -d " " -f 7 | sort | uniq -c | sort -r | less
조회수 가장 많은 5개, 가장 적은 5개만 보기
- head : 파일이나 파이프라인 입력 앞부분에서 10줄만 추출하는 명령어
- tail : 파일이나 파이프라인 입력 끝에서 10줄만 추출하는 명령어
- -n 옵션으로 개수 조절 가능
- head -n 3 : 앞에서부터 3줄 추출
- head -n -5 : 마지막 5줄 제외한 앞에서부터 모든 줄 추출
- tail -n 20 : 끝에서 20줄 추출
- tail -n + 6 : 처음부터 5번째 줄 빼고 그 다음부터 모든 줄 추출
19화 CSV 파일을 열의 내용에 따라 정렬하고 싶어 (sort와 >(리다이렉트))
csv 파일 자체는 일반 텍스트 파일 이므로 문자열 조작 명령어로 가공 가능
불필요한 열 제거
- cut 활용
- -f 옵션으로 열 번호 지정
- cat items.csv | cut -d "," -f 숫자(3 1-3 1,3,4,5 식으로 추출 가능)
sort 명령어 구분자로 나눠서 정렬
- -t 옵션 : 구분자 지정
- -k 옵션 : 열 번호 지정 (해당 열 기준으로 정렬)
정렬 기준
- sort는 문자열을 한 문자씩 비교해서 재배치
- -n 옵션 : 숫자로 해석해서 정렬
- 오른쪽 정렬시에는 단순정렬로도 제대로 정렬 가능
- 스페이스로 칸을 채워서 정렬한 경우에는 -b 옵션으로 스페이스 무시하고 정렬
리다이렉트( > )
- 명령어 실행 결과를 저장하는 명령어
- > : 이미 파일이 있으면 지우고 새로운 파일 생성
- >> : 기존 파일에 추가
csv 파일 구분자가 탭문자일 경우 -d 옵션 빼면 구분 가능
- 셸 스크립트 안에서는 cut -d "(탭문자)"로 가능
20화 명령줄 지정으로 작업 내용을 바꾸고 싶어 (명령줄 인수)
명령줄 인수 : 명령어에 대해 추가 지시를 내리는 것
지정한 순서대로 값을 참조함
$script.sh filename1 filename2
#!/bin/bash
source=$1
target=$2
....
옵션 이름으로 값을 참조함 (인수가 많은 경우)
$script.sh -s filename1 -t filename2
#!/bin/bash
while getopts s:t: OPT #getopts 뒤의 문자 : 옵션 이름으로 사용하는 알파벳
do
case $OPT in
s) source="$OPTARG" ;;
t) target="OPTARG" ;;
esac
done
....
21화 조건에 따라 처리 흐름을 바꾸고 싶어 (if)
조건에 따라 실행을 다르게 하고 싶을 경우
- 만약에 인수가 2개면 Hello를 출력하고 아니면 Bye 를 출력하는 스크립트
#!/bin/bash
#$은 스크립트에 지정한 인수 개수를 의미하는 특수한 변수
if [ $# = 2 ]
then
echo "Hello!"
else
echo "Bye!"
fi
if then 사용시 if 후 줄바꿈 후 then 을 써야함
if[$#=2] 라고 쓰면 안됨 -> [도 명령어, 명령어와 인수니까 사이를 띄어야 함
22화 명령어 이상 종료에 대응하고 싶어 (종료 상태 $?)
$? : 명령어를 실행한 다음에 명령어가 정상적으로 종료했는지 알려주는 값
- 0 : 정상 종료
- 그 외는 이상 종료
exit 에 인수로 숫자를 지정하면 셸 스크립트의 종료 상태가 됨
스크립트 실패 시 처리 조건문
if [ $? != 0 ]; then exit; fi
23화 같은 처리를 반복해서 실행하고 싶어 (for)
여러 스크립트를 반복적으로 실행해야하는 경우
./create-report.sh a.log , b.log, c.log, d.log 실행
for fileName in a.log b.log c.log d.log
do
./create-report.sh $filename
done
for fileName in a.log \
b.log \
c.log \
d.log \
do
./create-report.sh $filename
done
특정 디렉토리 하위의 모든 .log 파일 목록
- for fileName in 'cd /var/log/apache2; ls *.log | grep -v error.log'
- /var/log/apache2/ 위치에 있는 .log로 끝나는 파일 목록, error.log는 제외
24화 공통 처리를 계속 재사용하고 싶어 (셸 함수)
함수 : 어떤 처리를 하나로 묶어서 함수로 정의 가능
- 정의한 함수는 같은 스크립트 안에는 원하는 곳에서 몇번이고 호출 가능
- 함수도 인수를 사용 가능
- 함수 실행을 중단하고 원래 처리로 돌아갈 때는 exit가 아니라 return 사용
중요한 처리를 main() 함수로 미리 정의(최초에) 해 두고 마지막에 호출
#!/bin/bash
# 중요한 처리 내용을 최초에 정의
main() {
report a.log mail-${today}.csv /shared/marketing/reports
port b.log &{today}.csv /shared/system/mail-reports
report c.log ${today}.txt /shared/develop/reports/mail
}
# 중요한 부분 이외를 main 함수 뒤에 정의
report() {
source=$1
report=$2
outdir=$3
./analyze_mail_log.sh $source $report
mkdir -p $outdir
mv /tmp/${report} ${outdir}/
echo "$source 처리 완료"
}
today() {
date +%Y-%m-%d
}
# 마지막에 main 함수 한번만 호출
main
셸 스크립트의 인수와 함수의 인수
- 함수 안에서 $1 이라고 하면 셸 스크립트의 인수가 아니라 함수의 인수 참조
- 셸 스크립트 자체의 인수 함수 안에서 참조하려면 함수 밖에서 일단 다른 이름의 변수로 정의해두고 사용
#!/bin.bash
# 함수 밖에서 참조하고 있으므로 셸 스크립트의 인수가 됨
target=$1
do(){
copy /tmp/source $target
...
}
...
do
...
'Infra > linux' 카테고리의 다른 글
만화로 배우는 리눅스 시스템 관리 3권 (0) | 2022.02.02 |
---|---|
만화로 배우는 리눅스 시스템 관리 2권 (0) | 2021.10.01 |
리눅스 기본 디렉토리 구조 (0) | 2021.08.07 |
cat <<EOF (0) | 2021.08.07 |