오늘은 스크립트를 작성할 때 유용한 출력-수정 명령어를 실습해보겠다.
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 파일 세팅에 대한 이전 글이다. 참고하자.
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 |