본문 바로가기
Linux

sed (스크립트)

by Nirah 2022. 12. 15.

오늘은 스크립트를 작성할 때 유용한 출력-수정 명령어를 실습해보겠다.

 

Stream

stream 이란 다음과 같이 여러 파일을 하나로 취급해 읽는 것이다.

cat 은 stream은 되지만 동시에 edit은 안된다.

 

 

sed

이름에서 알 수 있다싶이 sed는 stream 능력과 edit 능력이 동시에 있다.

출력 : sed ' ~ /p'  

수정 : sed -i ' ~ / '      or      sed -e ' ~ / '

 

sed에 대한 메뉴얼 보기

man sed

 

sed -n '1p;2p;3p' 1 2 3

하나의 파일처럼 출력되고 edit도 가능하다.

 

 

준비물

 

 selinux 설정파일 복사

cp -v /etc/selinux/config ./ sed '' config

vi config Unix is not the Linux. Linux is not the Unix. Linux is the Linux. Unix is the Unix.

 

 

 

 

출력

 

양식은 대략 sed 's///p' config 모양이다. (set-print)

config 파일을 필터링이나 별도 변경 없이 출력

sed '' config

config 파일의 permissive를 disabled로 변경 후 표준 출력

디폴트로 모든 라인 + 변경 된 라인이 함께 두번 출력돼서 변경된 라인을 알아보기 쉽게 한다.

-n 옵션을 주면 변경된 라인만 표시할 수 있다.

 

sed 's/permissive/disabled/p' config

sed -n 's/permissive/disabled/p' config

 

 

 

필터링 (정규표현식)

 

정규표현식에 관한 내용은 여기다.

https://raid-1.tistory.com/114

 

만약 permissive가 여러개 있다면 원하지 않는 permissive도 같이 바뀔 것이다.

원하는 설정값만 변경하고 싶을 때는 정규표현식을 사용해 필터링 해보자. (패턴 매치)

 

전체에서 permissive$에 매칭되는 것을 disabled로 바꿔보자.

sed -n 's/permissive$/disabled/p' config

 

^SELINUX와 매칭되는 permissive$만 disabled로 바꿔라

SELINUX로 시작하는 행만 조건값대로 변경

sed -n '/^SELINUX/ s/permissive$/disabled/p' config 

 

1개 이상의 매칭되는 값을 찾기

sed -n '/^SELINUX/p; /^SELINUXTYPE/p' config

 

2개 이상의 매칭 값을 이용하여 매핑 변경

sed -n '/^SELINUX/ s/permissive/enforcing/p; /^SELINUXTYPE/ s/targeted/targeting/p' config

7번 라인을 출력

sed -n '7p' config

7번 라인과 마지막 라인을 출력

sed -n '7p;$p' config

17줄~19줄 주석 제거 출력 / 적용

sed -n '17,19 s/#//p' ssh

sed -i '17,19 s/#//' ssh

 

 

행별 첫번째 매칭되는 값만 변경 됨

sed -n 's/Linux/Unix/p' config

비교용 원본

 

행별 두번째 매칭되는 값만 변경 됨

sed -n 's/Linux/Unix/2p' config

 

 

 

출력을 저장

 

print는 출력하는 기능이라 원본을 수정하진 않았다.

원본 변경 안 되어 있음 원본을 유지한 상태에서 변경된 출력물을 따로 저장하자

sed -n 's/permissive$/disabled/p' config > config1

cat config1

 

-i 옵션을 사용하여 원본을 변경

행별 두번째 매칭되는 값만 변경

sed -i 's/Linux/Unix/2' config

tail -5 config

 

 

 

 

 

SSH 파일 세팅 스크립트

큰 회사에선 심하면 2명이서 몇천대의 가상화 머신을 관리한다.

이런 경우 ssh 설정 하나만 바꿀래도 아득할 것이다.

sed 명령어를 사용해 스크립트를 작성하여 작업을 최소화 해보자.

 

 

sshd_config 수정 가이드

우선 설정파일의 어느 부분을 바꿀지 정하자.

vi /etc/ssh/sshd_config 파일에 실수하면 안되니까

 cp /etc/ssh/sshd_config ssh 해서 사본으로 우선 테스트 해가며 만든다.

 

아래는 ssh 파일 세팅에 대한 이전 글이다. 참고하자.

https://raid-1.tistory.com/60

 

ssh 암호화 접속 (공개키, 대칭키)

SSH +ID +PASS 로 접속 하는 것이 목표 ssh +SSL (RSA: 공개키 +개인키) 암호화 1. 대칭키 암호화키 = 복호화키 키가 노출 사용자가 늘어날 수록 키 보관 및 키 전송 2. 공개키 암호화키 = 복호화키 공개키

raid-1.tistory.com

0~139줄에 있는 많은 내용을 안겹치고 특정한 부분만 찝어서 설정을 바꾸려면

역시 줄을 지정하는게 간편하고 확실하다.

 

 

 

출력 옵션으로 테스트

 

sed -n '17 s/#Port 22/Port 2222/p' ssh

 sed -n '38 s/#PermitRootLogin yes/PermitRootLogin no/p' ssh

sed -n '43 s/#//p' ssh

 sed -n '63 s/^#P/P/p; 63 s/yes/no/p' ssh

systemctl restart sshd

 

 

 

 

 

sed 멀티 라인 적용

sed 명령어로 스크립트 작성 시 주의사항이 있다.

여러 번의 sed를 연속으로 중첩하는 스크립트 작성 시 아래와 같이 -e 옵션이나 | 나 ; 으로 나눠줘야 한다.

왜냐하면 앞의 sed를 뒤의 sed가 출력하여 이어받아서 써야 하기 때문이다.

역슬레쉬 \ 는 보기 좋으라고 줄 띄워 놓는 것일 뿐이다.

 

-e 옵션 사용

# sed -i -e 's/#Port 22/Port 22222/' -e 's/ListenAddress 0.0.0.0/#ListenAddress 0.0.0.1/' ssh

 

| 파이프 사용

# sed -i 's/#Port 22/Port 22222/' ssh | sed -i 's/ListenAddress 0.0.0.0/#ListenAddress 0.0.0.1/' ssh

 

; 콜론 사용

# sed -i -e 's/#Port 22/Port 22222/; s/ListenAddress 0.0.0.0/#ListenAddress 0.0.0.1/' \

ssh

 

 

-e 옵션 출력으로 테스트

sed -n -e '17 s/#Port 22/Port 2222/p' -e '38 s/#PermitRootLogin yes/PermitRootLogin no/p' -e '43 s/#//p' -e '63 s/^#P/P/; 63 s/yes/no/p' ssh

 

 

 

 

 

 

 

중간 확인 포인트

스크립트가 길어지면 중간 단계 단계마다 잘 적용됐는 지 확인이 어려워진다.

그래서 기점마다 echo로 메세지를 출력시키거나

systemctl restart sshd 같이 결과가 적용됐는 지 확인하기 어려운 경우는

systemctl status sshd를 쓴다.

 

설치 로그파일인 aaa에 저장되게도 만들어보자.

touch aaa

echo "success" | cat > aaa

이쪽은 그냥 스크립트 진행 중간에 나타나게 해보자.

systemctl status sshd | cat

 

 

 

 

 

스크립트 파일 생성

위에서 테스트 하느라 출력으로 설정한 명령어를 모두 수정으로 바꿔써준다.

-n -> -i

p -> 삭제

 

그리고 -e옵션을 적용해 보겠다.

 

 

 

vi sed.sh

 

# ! /bin/bash

sed -i -e '17 s/#Port 22/Port 2222/' -e '38 s/#PermitRootLogin yes/PermitRootLogin no/' -e '43 s/#//' -e '63 s/^#P/P/; 63 s/yes/no/' ssh

echo "success_sed" | cat

systemctl restart sshd

echo "success_restart" | cat

systemctl status sshd | cat

 

 

 

결과 확인

실행

sh sed.sh

확인을 위한 장치들이 잘 작동했다.

 

cat -n ssh

원하는 대로 파일이 바뀌어있다.

 

 

'Linux' 카테고리의 다른 글

rdate - 타임서버와 시간 동기화  (0) 2022.12.22
awk  (0) 2022.12.16
egrep 정규표현식 (연습)  (0) 2022.12.14
VMware 네트워크 새 세팅  (0) 2022.12.13
linux routing (Networking 문제 트러블 슈팅)  (0) 2022.12.06