Infra/linux

만화로 배우는 리눅스 시스템 관리 2권

미니문92 2021. 10. 1. 06:42

 

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

crond : 지정한 시각에 명령어를 자동 실행하는 서비스

cronjob : crond로 실행하고 싶은 명령어와 실행시각

crontab : cronjob을 관리하는 명령어

sudo crontab -l(소문자 알파벳 L)

  • -l : list, cronjob 목록 표시 옵션
  • -e : edit, cronjob 설정 편집(환경변수 EDITOR 로 지정한 에디터 실행)
30 10 * * * /scripts/example.sh
분 시 일 월 요일 / 파일명

cronjob 설정 후 맞는지 확인할때는 약 2분 뒤로 설정

cronjob은 crontab 명령어를 실행하는 사용자 권한으로 동작

crontab에 "MAILTO=메일주소" 추가하면 cronjob출력내용이 메일로 보내짐(MTA 설정된 경우)


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

ssh나 scp의 인증방식에는 암호 입력 외의 공개키 인증 방식이 있음

키 인증을 하려면 미리 공개키와 비밀키의 쌍을 작성하고 공개키를 인증 대상 서버에 등록해야함

비밀키는 패스프레이즈(passphrase : 키 봉인을 풀기위한 암구호)를 아는 사람만 사용 가능

ssh-keygen

공개키 서버에 등록하는 방법

1. 공개키 파일을 서버에 복사
minimun@minimunpc:~$ scp id_rsa.pub minimun@10.144.10.152:/tmp/
minimun@minimunpc:~$ ssh minimun@10.144.10.152

2. 그 키쌍으로 인증하고싶은 사용자 홈디렉터리 바로 아래의 .ssh 디렉터리에 authorized_keys라는 이름으로 저장
minimun@devserver:~$ sudo mkdir -p ~ym/.ssh/
minimun@devserver:~$ sudo mv /tmp/id_rsa.pub ~ym/.ssh/authorized_keys

3. 소유권을 해당 사용자로, 그룹도 해당 사용자 그룹으로 설정
minimun@devserver:~$ sudo chown -R ym:ym ~ym/.ssh/

4. 디렉터리 권한 700 -> 소유자만 읽기,쓰기,관람 가능
파일 권한 600 -> 소유자만 읽고 쓰기 가능
minimun@devserver:~$ sudo chmod 700 ~mint/.ssh
minimun@devserver:~$ sudo chmod 600 ~mint/.ssh/authorized_keys

5. 한번에 하는 방법. 전제는 암호인증 또는 이미 등록된 키쌍으로 그 사용자도 로그인 가능해야함.
$ssh-copy-id -i ~/.ssh/id_rsa.pub minimun@10.144.10.152

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

자동 인증용 패스프레이즈 없는 비밀키

ssh-keygen
/home/minimun/.ssh/logdl 경로를 지정하고 패스프레이즈 입력하지 않고 Enter 입력

서버에 등록 후 특정 명령어를 실행하는 전용 키로 설정

>>(기존 파일 끝에 추가)로 리다이렉트
cat /tmp/logdl.pub >> ~/.ssh/authorized_keys
  • 파일을 다운로드할 때 scp -f 서버파일 경로
  • 파일을 업로드할 때 scp -t 서버파일 경로

authorized_keys에 command="명령어열"을 쓰면 그 공개키로 인증했을 때 지정한 명령어만 사용 가능

cronjob으로 scp한다면 자동 인증용 비밀키를 -i 옵션으로 지정해서 키 인증


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

어떤 부분의 변경이 다른 부분에 크게 영향을 끼치는 것을 강한결합

세세한 단위로 나누어져서 영향을 주고 받는 범위가 최소한으로 줄어든 상태를 느슨한 결합

  • 결합된 곳 이외의 변경은 서로에게 영향을 주지 않음
  • 전체적으로 변경이나 장애 대응에 강해짐
  • 작업 순서나 진행 방법을 조절하기 쉬워짐

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

  • cat /var/log/apache2/access.log | grep -v "/live" | cut -d " " -f 7 | sort | uniq -c 

결과는 페이지 별 접속수 집계가 나옴

wc : 지정한 파일이나 파이프라인으로 넘ㄴ어온 내용의 문자수와 줄 수를 세서 결과를 돌려줌(word count)

  • -l 옵션 : line 수
  • -w 옵션 : word 수
  • -m 옵션 : 문자 수

아파치 로그를 날짜로 추출하려면 grep 정규표현식 사용(-E 옵션)

$$(계산식))으로 간단한 계산 가능

  • echo $((1-2)) 

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

sed(stream editor) : 스트림 에디터, 텍스트 편집용 도구

gedit, vim 은 스크린 에디터라고 부름

  • -e 옵션 : 옵션 하나가  sed에 대한 하나의 지시, 여러번 지정 가능
sed -e "s/치환전 문자열/치환후 문자열/"

-i 옵션 : sed 자체가 파일을 저장

리눅스에 사용하는 GNU sed는 -i 옵션 뒤 스페이스 없이 지정
sed -i".bak" -e "s/반환중/회수완료/" /tmp/example.csv

OS X나 BSD에서 사용하는 BSD sed는 -i 옵션 뒤에 스페이스를 넣고 지정
sed -i ".bak" -e "s/반환중/회수완료/" /tmp/example.csv

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

part1 : vim에서 정규 표현식 사용해서 일괄 치환하기

grep -E 옵션 : 확장 정규 표현식

vim에서 검색이나 치환할 때

:%s/\v검색할 패턴/치환 후 문자열/
:%s/\v(반환중|회수중|반송)/회수완료/ -> 반환중,회수중,반송이 모두 회수완료로 변경

part2 : sed로 정규표현식 사용하기

리눅스용 -r 옵션 : 확장 정규 표현식
OS X나 BSD -E 옵션 : 확장 정규 표현식

part3 : 발견한 것 중 일부만 치환하기

back reference 역참조

  • 우선 치환 전후에 변하지 않을 부분을 포함해서 치환 대상이 될 문자열 전체를 나타내는 정규 표현식을 만듬
  • 치환 대상 정규 표현식을 인용해서 괄호로 감싼부분을 "\숫자"로 바꿈

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

한줄에 같은 문자열이 여러번 반복될 경우 한꺼번에 수정(전체 치환 모드)

  • sed -e "s/치환전 문자열/치환후 문자열/g"

대소문자 차이 무시

  • sed -e "s/치환전 문자열/치환후 문자열/i"
  • 같이 쓸때는 /gi 혹은 /ig

범위 안의 한 문자를 가리키고 싶을 때, 나열한 것 중 한 글자 가리키기

  • 브라켓 표현 [ 0 - 9]

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

특정 종류의 문자 연속만 지정하기

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

특정 종류 이외의 문자 연속만 지정하기

  • 브래킷 표현의 부정형 ^

줄의 처음에만 등장하는 경우

  • 브래킷 표현의 부정형이 아닌곳에서 ^를 쓰면 줄 시작을 의미

줄 끝에만 등장하는 경우

  • &

vim 명령어 모드에서도 마찬가지

  • ^는 현재 줄 처음으로 커서 이동
  • &는 현재 줄 끝으로 커서 이동

10화 오래된 파일을 찾아서 지우고 싶어(FIND)

find : 다양한 조건으로 파일 검색 명령어. 날짜기반 가능

  • ctime 옵션 (changed time)
find ./-ctime +30 : 1개월 이상 지난 파일 목록
  • -ctime +숫자 : 과거
  • -ctime -숫자 : 미래

실수 예방을 위해

find ./ -ctime +숫자 | less

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

과거 일정 기간 범위 지정

  • find /logs/ -ctime +7 -and -ctime -15

특정 이름의 오래된 파일 검색

  • find /logs/ -ctime +180 -and -name "*string*" -> 파일명에 string 포함

여러 파일명 파일 검색하기

  • or 명령어 와 조건 우선순위를 지정하려면 \로 감쌈

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

df : 디스크 빈 공간을 숫자로 취득하기(disk free)

if : 숫자 크기를 비교해서 조건 분기하는 방법

  • -lt : less than
  • -gt : greater than
  • -h 옵션 : --human-readable, 사람이 보기 편하게 출력

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

명령어 && 명령어

  • 프로그램을 소스에서 빌드 후 설치하기 : ./configure --prefix=$HOME/local/ && make && make install
  • 최신 정보에 따라 패키지를 갱신하기 : sudo apt-get update && sudo apt-get upgrade && sudo apt-get clean

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

명령여 || 명령어 : 성공할때까지 나열한 명령어를 순서대로 실행

폴백 처리 : 실패하면 창선책으로 단계적으로 전환


15화 부모 디렉터리로 일일이 돌아가는 조작을 생략하고 싶어(서브셸)

서브셸 : 셸에서 일시적인 분신을 만들어서 명령어를 실행하는 방법. cd 와 이어진 처리를 서브셸로 실행하면 원래 디렉터리로 돌아가지 않아도 됨

서브 디렉터리 안에서 실행하고 싶은 명령어를 소괄호를 감싼 후 각각의 줄 끝에 세미콜론(;) 추가

#!/bin/bash
for dir in logs data users
do
    (cd $dir;
    files=$(find ./ -name "*.bak");
    for file in $files;
    do
        rm $file;
    done)
done

cd - : 이전 디렉터리로 이동


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

hostname 명령어를 사용하면 그 컴퓨터의 호스트명을 알 수 있음

명령어 실행 결과나 변수값에 대해 case문으로 작성 가능

case "$hostname)* in
  a)
    ...;;
  b)
    ...;;
esac

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

대상이 확실한 구체적인 선택지부터 작성하고 추상도가 높은 선택지를 나중에 적는 것이 기본 원칙

case문으로 추상적인 선택지를 정의하려면 와일드카드(*와 ? 사용)

case문 선택지에 | 로 여러 패턴 나열 가능

*.?sv -> 확장자 3글자 중 끝2글자가 sv인 파일
*.[ct]sv -> 확장자 첫글자가 c 또는 t
*.[^ㅊ]sv -> 확장자 첫글자가 c가 아님
*.[a-c]sv -> 확장자 첫 글자가 a에서 c 사이 범위
*.[^a-c]sv -> 확장자 첫 글자가 a에서 c 범위 이외

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

while 반복문 : 조건식 평가 후 조건이 만족하면 실행

 

  • for문 : 목록 내용을 하나씩 처리하기 위한 구분
  • while문 : 반복하는 자체에 특화된 구분

 

curl : 인수로 지정한 url에 접속해서 받은 결과를 출력하는 명령어

sleep : 지정한 초만큼 처리를 멈추는 명령어

  • sleep 숫자 : 초, s(seconds), m(minutes), d(days)를 붙여서 지정 가능

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

read : 표준 입력을 한줄단위로 읽음 

mktemp : 임시 파일 생성

temp=$(mktemp)
while read line
do
    echo ~...
done
...

[ 명령어 : test 명령어

test 10 -gt 5 과 [ 10 -gt 5 ] 가 같은 명령


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

while과 read로 반복문을 사용해서 입력들을 한줄씩 처리

어떤 이름의 파일이 올지 모르면 for 보다는 while, read사용하는 것이 안전


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

read 명령어에 -p 옵션 : 출력하고 나서 입력 대기

#!/bin/bash
read -p "이름이 뭐니?> " first_name
echo -n "성이 뭐니?> " last_name
이름이뭐니?> minimun 
성이 뭐니?>

22화 키보드 입력을 확인해서 다시 입력받고 싶어(CONTINUE와 BREAK)

continue : 확인 후에 조건 분기를 두고 반복처리 처음으로

break : 반복 처리 외부로


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

셸 스크립트가 정보를 출력하는 출구 : 1번 표준 출력(standard output), 2번 표준 에러 출력(standard error)

파일로 리다이렉트하거나 다른 명령어에 넘기는 파이프라인이라면 표준 출력만 연결

  • 1> 는 표준출력 ( > 과 같다 )
  • 2> 는 표준 에러 출력

>& : 특수한 리다이렉트 지정

뒤에 지정한 번호의 출력과 같은 출력 대상에게 리다이렉트한다는 의미

다시말하면 표준 에러 출력을 표준 출력 출구(파이프라인)로 리다이렉트

$ ./test.sh -u ab 1>/tmp/log.txt 2>&1

1번(표준출력)에 나온 정보를 /tmp/log.txt 파일에 쓰도록 연결되고 2번(표준에러출력)에서 나오는 정보도 1번 출구와 연결된 파일 쓰기용 입구로 흐르도록 연결


23.5화 사용자 작성용 명령어 차이를 파악하고 싶어(adduser, useradd)

유저 생성

  • adduser : 대화식 (편리함)
  • useradd : 비대화식 (조금 더 복잡함, 기본적으로 사용)

유저 삭제

  • deluser : 대화식
  • userdel : 비대화식

실행하기전에 --help로 사용법 확인하기

'Infra > linux' 카테고리의 다른 글

만화로 배우는 리눅스 시스템 관리 3권  (0) 2022.02.02
리눅스 기본 디렉토리 구조  (0) 2021.08.07
cat <<EOF  (0) 2021.08.07
만화로 배우는 리눅스 시스템 관리 1권  (0) 2021.07.31