본문 바로가기
주경야독

[OS/리눅스] 만화로 배우는 리눅스 시스템 관리 2

by 하늘의흐름 2017. 10. 14.
반응형
만화로 배우는 리눅스 시스템 관리 2 - 10점
Piro 지음, 서수환 옮김/길벗



상당히 유용한 느낌의 리눅스 시스템관리서
대부분의 내용은 커맨드를 다루는 것인데,
그 중에서도 셸 스크립트에 대해서 다루는 내용이 많다.

스크립트를 작성하고 그에 대한 설명을 들어보면
프로그래밍에 대한 설명하고 흡사하다.

예전에 프로그래밍 공부가 문법에 대한 공부였다면,
여기서는 문법적인 설명외에도 해당 명령어를 
어떤 때에 쓰면 적합한지 조언까지 해주기 때문에
그런 점에서 유용하다고 볼 수 있다.


프롤로그지금까지의 이야기

1화 정기적인 작업을 자동으로 처리하고 싶어
- CRONTAB

* crontba -e 로 cronjob을 설정하면 임의 명령어열을 지정 시간에 정기적으로 실행 가능
* cronjob은 crontab 명령어를 실행하는 사용자 권한으로 동작함
* "MALTO=메일주소"라는 열을 추가하면 그 이후의 cronjob 출력 내용이 메일로 보내짐(MTA를 설정해둬야 함)

2화 키 인증으로 안전하게 로그인하고 싶어
- 공개키 인증

* ssh나 scp의 인증 방식에는 암호 인증 이외에도 더욱 안전한 키 인증(공개키 인증)방식이 있음
* 키 인증을 하려면 미리 공개키와 비밀키의 쌍을 작성하고 공개키를 인증 대상 서버에 등록해야 함
* 비밀키는 패스프레이즈를 아는 사람만 사용 가능

3화 정시 처리로 자동으로 SCP하고 싶어
- 패스프레이즈 없는 비밀키

* 패스프레이즈 없는 비밀키를 사용하면 자동으로 키인증 가능함(자동 인증)
* 안전하도록 자동인증용 키 쌍은 인증 후 할 수 있는 일을 가능한 제한하기(일반 작업에만
쓰고 로그인용으로 사용하지 않기)
* cronjob으로 scp한다면 자동 인증용 비밀키를 -i 옵션으로 지정해서 키 인증하거나
공개키라면 실행할 scp 명령어 내용에 대응하는 서버 쪽 명령어열을 command="명령어열"
형식으로 설정하기

4화 여러 서버에 있는 파일을 효율적으로 수집하고 싶어
- 처리 분산과 느슨한 결합 연계

*  자동 인증으로 scp하려면 다운로드 허가 대신에 업로드를 허가하는 쪽이 비교적 안전
* 키워드는 "처리 크기는 작게", "처리 사이는 느슨한 결합으로", 커다란 문제는 일단 작은 문제로 쪼개서 생각하기
* 여러 서버가 관련된 처리는 각각의 서버 단위에서 처리가 가능한 완료되도록 하면 서버끼리
통신하는 걸 최소한으로 줄일 수 있음

5화 조건에 해당하는 로그 줄 수를 집계하고 싶어
- WC와 산술 확장

* wc 명령어를 사용하면 입력한 내용 문자수나 줄 수를 카운트 가능. 특히 줄 수를 세는 wc -l은 자주 사용함
* 아파치 로그를 날짜로 추출하려면 grep의 정규표현식을 사용하면 좋음.
* bash 스크립트는 $((계산식))으로 간단한 계산이 가능. 변수와 조합하면 집계에서도 사용 가능

여담) WC 유래
예전에 영국에서는 집에서 조금 떨어진 곳에 구멍을 파서 그 위에 작은 집을
짓는 형식의 화장실을 Earth Closet(땅 위의 방)이라고 불렀다고 해.
한편 수세식 화장실을 Water Closet(물이 있는 방)이라고 불렀다고 하는 것 같아.

6화 여러 텍스트 파일을 일괄 편집하고 싶어
- SED

* 셸 스크립트에서 텍스트를 자동 편집하고 싶을 때 sed 사용
* sed로 문자열을 일괄 치환하려면 sed -e "s/치환전/치환후/" 지정
* 셸 스크립트에서 기존 파일을 편집해서덮어쓰기를 할 때는 주의가 필요. 일단
다른 파일명으로 변경해두고 원래 파일 위치에서 출력하는 등으로 같을 파일을
하나의 처리에서 읽고 쓰지 않도록 해야 함


7화 표기 방법이 일정하지 않은 문구를 한꺼번에 치환하고 싶어
- 정규 표현식 치환과 일치 결과의 역참조

* vim 검색이나 치환에서는 확장 정규 표현식을 사용할 때 \v 뒤에 
정규 표현식을 작성함
* sed로 치환할 때 확장 정규 표현식을 사용하려면 GNU sed는 -r 옵션,
BSD sed는 -E 옵션을 지정함
* 정규 표현식은 치환후 지정에 \번호를 써서 (와 )로 감싼 치환전 내용을
치환후 내용에 인용 가능(역참조)

번외) 백슬래시와 원소기호

8화 정규 표현식 패턴 지정을 좀 더 간단히 만들고 싶어
- 대소문자 무시와 문자 범위 지정

sed 문자열 치환 명령어

* 치환 대상이 한 줄안에 두번 이상 나올 때 모두 치환하려면 g 플래그를 지정하기
* 치환 대상의 대소문자 차이를 무시하고싶다면 i 플래그를 지정하기
* 열거한 여러 문자나 문자 범위에 포함된 문자 하나를 치환하고 싶다면
브래킷 표현(대괄호로 안에 문자나 문자 범위를 나열함)을 사용하기

예시)
"s/Windows XP/Widows/gi'
"s/([A-F])-/\1-0\"
"s/)[G-IKMO-R])-/\1-1\"

9화 정규 표현식 패턴 지정을 더 간단히
- 범위 밖 문자 지정과 줄 시작, 줄 끝 지정

* 직전 문자가 0번 이상 반복됨
+ 직전 문자가1번 이상 반복됨

[0-9] 모든 숫자
^ 부정. 반전(!=)의 의미
[a-z]+ 소문자 알파벳이 연솓된 문자열=영단어


10화 오래된 파일을 찾아서 지우고 싶어
- FIND
find ./ -ctime +365
최종 갱신일이 1년 이상 된(이 1년간 변경되지 않은) 오래된 파일

find ./ -ctime -8
최종 갱신일이 1주일 이내인(이 1주일 사이에 변경된) 새로운 파일

find ./ -ctime 7
최종 갱신일이 딱 1주일 전인 파일


* 오래된 파일이나 새로운 파일을 찾으려면 find 명령어를 사용함.
지정 방법은 find 검색 대상 -ctime 최종 갱신일 범위

* 최종 갱신일 지정은 우선 기준이 되는 과거 날짜까지의 일수를 정함.
(1개월 전이라면 30. 1년 전이라면 365등) 그보다 과거(오래된 파일)를 검색한다면 _,
미래(새로운 파일)를 검색한다면 -를 추가

* find 명령어로 찾은 모든 파일을 for 반복문에서 사용할 수 있음.

번외) atime, mtime, ctime

-atime은 최종접근시간(accessed time)의 약어이다. 내용물을 마지막으로 읽은 날짜를 검색한다.
아무도 오랫동안 보지 않은, 지워도 될 것 같은 파일을 찾을 때 유용하다.

-mtime은 최종 변경시간(modified time)의 약어이다. 파일이 변경된 시간을 의미한다.

-ctimre은 이름이나 퍼미션, 디렉터리 이동 등으로 생긴 변경 등의 각종 최종 변경 시각.

대부분은 ctime으로 충분하며 필요없는 것까지 나온다면 -mtime을 쓸 수 있다.

11화 좀 더 복잡한 조건으로 파일을 찾고 싶어
- FIND의 복잡한 검색 조건

* 파일명으로 파일을 검색하려면 -name을 사용
* 검색 조건1 -and 검색 조건2라고 쓰면 두 검색 조건 양쪽을 만족하는 파일이 검색됨
* 검색조건1 -or 검색 조건2라고 쓰면 두 검색 조건 양쪽 또는 어느 한쪽을 만족하는 파일이 검색됨
* 검색 조건은 3개 이상 조합할 수 있음. 조건 우선순위를 지정하려면 \(와 \)으로 감쌈 - 98p

-ctime -8 -and -name "*.log"
직전 일주일 전에 변경된 이름이 *.log로 끝나는 파일

-ctime +30 -andm -ctime -60 -and
\(-name "*report*" -or -name "*error*" \)
지난달 1개월 사이에 변경된, 이름에 report 또는 error을 포함한 파일

-name "*.tar.gz*" -or  \( -ctime +7 -and -name "*.log*" \)
이름이 .tar.gz로 끝나는 파일 또는 1주일보다 이전에 변경된 이름이 .log로 끝나는 파일

문자열을 확실하게 문자열로 지정하기 위해서 인용 부호로 감싸는 습관을 들여두렴! - 99p


12화 디스크가 가득 차기 전에 파일을 삭제하고 싶어
- DF와 숫자 크기 차이로 조건 분기

df 디스크 빈 용량 확인
df - h -> 사람이 읽기 편리하게 바뀜
X -lt Y 숫자 크기 비교  X < Y (X는 Y보다 작다;X is Less Than Y)
X -gt Y 숫자 크기 비교  X > Y (X는 Y보다 크다;X is Greater Than Y)

13화 이전 명령어가 성공하면 다음도 실행하고 싶어
- AND 리스트

예시
- 프로그램을 소스에서 빌드 후 설치하기
./configure --prefix=$HOME/local/ && make && make install

AND 리스트는 종료 스테이터스에 따라 분기할 수 없다.

신택틱 슈가(Syntatic sugar;편의 문법) :  실제로는 어떤 의미인가?라는
본질을 모른 채 설탕만 빨다 보면 문제가 생겼을 때 쓴맛을 보게 될거야.

prepare-data &&
 process-data &&
  report-result

14화 이전 명령어가 실패하면 다음을 실행하고 싶어
- OR 리스트

OR 리스트는 OR로 연결한 명령어 중에서,
하나라도 성공하면 종료된다.

download-data --server=primarty.datastore ||
 download-data --server=secondary.datastore || 
  exit 1

AND 리스트와 OR 리스트는 구분자 다음에 줄바꿈해도 된다.

15화 부모 디렉터리로 일일이 돌아가는 조작을 생략하고 싶어
- 서브셸
서브셸은 셸에서 임시로 분신을 만들어서 그쪽에서 명령어를 실행하는 방법이다.

cd - 로 이전 디렉토리로 이동할 수 있다.

16화 3 패턴 이상을 사용하고 싶어
- CASE

1) hostname 명령어를 사용하면 그 컴퓨터의 호스트명을 알 수 있음
2) 명령어 실행 결과나 변숫값에 대해 A와 같다면, B와 같다면, C와 같다면처럼
경우로 나뉘는 조건 분기는 case문으로 작성하면 좋음

번외) 거꾸로 쓰는 유래
bash 원조인 bsh이라는 셸 시절의 이야기인데 bsh을 만든 사람이
좋아하는 프로그래밍 언어인 알골(algol)을 흉내 낸 거라고 해.

그리고 그 제작자가 스티브 본(Steve Bourne)인데, 
본이 만든 셸이니까 Boume SHell이라 bsh.
그 개량판이 Bourne Again SHell이라 bash. 이게 bash 이름의 유래야. - 139p

17화 사원 번호 첫 글자로 처리를 나누고 싶어
- CASE 패턴 지정

case 문의 선택지에 와일드 카드를 쓰는 경우,
구체적인 선택지를 위에 쓰고, 추상적인 선택지를 아래에 쓴다.
(case 문 선택지는 값에 해당하는지를 위에서부터 내려오면서 판단한다.)


case 문에서 추상적인 선택지는 와일드카드(?,|,*) 로 적용 가능함.
case 선택지에는 정규표현식은 쓸 수 없지만, 브래킷 표현은 가능함.(문자하나만)

번외) 와일드카드와 브리킷

ls *.[ct]sv 확장자 첫 글자가 c 또는 t
ls *.[^c]sv 확장자 첫 글자가 c가 아님
ls *.[a-c]sv 확장자 첫 글자가 a에서 c사이 
ls *.[^a-c]sv 확장자 첫 글자가 a에서 c사이 범위 이외 


18화 같은 처리를 1시간마다 반복 실행하고 싶어
- WHILE 반복과 SLEEP

curl은 url에 접속해서 받은 결과를 출력하는 명령어이다 - 152p

이미 있는 값 목록을 처리할 때는 for 반복문,
그 이외는 while 반복문이라고 기억해두렴. - 154p

19화 명령어 출력을 파이프라인으로 받고 싶어
- 표준 입력과 READ

read 명령어는 파이프라인으로 넘긴값도 받아올 수 있다.
mktemp 명령어는 임시 저장파일을 만드는 명령어다.


20화 스페이스가 들어 있는 파일명도 반복 처리에 쓰고 싶어
- WHILE 반복과 READ

read를 이용하면 공백문자가 있어도 끊지 않고, 입력값으로 넘긴다.
for는 공백문자를 구분자로 쓰기 때문에 for 대신에 while을 활용한다.


21화 키보드 입력을 받고 싶어
- READ로 입력 대기

read your_name
echo "안녕하세요. $your_name"

이렇게 하면 your_name 변수에 키보드 입력값을 저장할 수 있다.
다만 아무런 출력도 없이 커서만 깜빡이면서 대기상태로 들어가기 때문에
입력 전에 문자를 출력해서 입력하기 더 편하게 만들 수 있다.

read -p "너의 이름은?">
read your_name
echo "안녕하세요. $your_name"

이렇게 하면 된다. 번외로 출력은 echo로도 할 수 있다.

echo -n "너의 이름은?">
read your_name

echo를 써서 출력하면
프롬프트 출력부분과 입력부분을 확실하게 구분할 수 있게된다.
그리고 프롬프트 문자색을 변경하려면 echo로 출력이 필요하다.

22화 키보드 입력을 확인해서 다시 입력받고 싶어
- CONTINUE와 BREAK
read name
이렇게 하면 name이라는 변수로 입력값을 받는다.

continue 는 반복 처러 처음으로, break라면
반복 처리 외부(반복 이후)로 처리흐름이 뛴단다!

23화 명령어의 모든 출력을 파일로 저장하고 싶어
- 표준 에러 출력

표준 에러 출력의 리다이렉트
2>&1
2<& 1

>&는 특수한 리다이렉트 지정인데 그 뒤에 지정한 번호의 출력과
같은 출력 대상에게 리다이렉트한다는 의미야 - 193p


23.5화 사용자 작성용 명령어 차이를 파악하고 싶어
- USERADD와 ADDUSER와 USERDEL과 DELUSER


솔라리스나 NetBSD는 명령어가 없고 레드햇 계열은 그저 useradd  심볼릭 링크에 불과해- 195p, adduer 에 대하여


반응형

댓글