다음 세부 정보가 포함된 ip.txt 파일이 있습니다.
cat ip.txt
10.10.100.11 10.10.100.12
10.10.100.21 10.10.100.22
10.10.100.101
10.10.100.31 10.10.100.32
10.10.100.201
eof
한 줄에 공백으로 구분된 두 개의 IP가 있는 경우 하나는 활성 서버이고 다른 하나는 수동 서버일 수 있습니다. IP가 하나만 있는 경우 해당 IP는 활성 서버일 뿐입니다.
그래서 스크립트가 파일을 확인한 ip.txt
다음 해당 활성 서버에만 로그인하여 출력을 얻도록 하고 싶습니다.ps -ef| grep pmon
답변1
이 awk
유틸리티를 사용하여 파일의 각 줄에서 공백으로 구분된 첫 번째 필드를 추출할 수 있습니다.
각 IP 번호 출력에 대해 쉘을 사용하여 awk
원격으로 ssh
명령을 실행할 수 있습니다. 원격 호스트에서는 ps -ef
필터링을 수행할 필요가 없습니다.grep
#!/bin/sh
awk '{ print $1 }' ip.txt |
while IFS= read -r remote; do
printf 'Processing %s...\n' "$remote"
ssh -n "$remote" ps -ef | grep -F pmon
done
-n
with 옵션을 사용하면 ssh
출력의 나머지 부분을 읽을 수 없습니다 awk
.
-F
option을 사용하면 grep
유틸리티가 정규식 일치 대신 텍스트 문자열 비교에 지정된 패턴을 사용합니다. 이 옵션을 사용해도 현재 코드에 대한 어떤 것도 변경되지 않으며 실행 속도도 빨라지지 않습니다(이 ssh
명령은 아마도 이 스크립트의 병목 현상일 수 있습니다). 그럼에도 불구하고 이는 정규 표현식이 아닌 텍스트 문자열을 사용하여 검색하고 있음을 독자에게 알립니다.
awk
루프의 입력 파일에서 공백으로 구분된 두 개의 값을 읽고 두 번째 값을 무시하면 이 코드를 쉽게 제거할 수 있습니다.
#!/bin/sh
while read -r remote dummy; do
printf 'Processing %s...\n' "$remote"
ssh -n "$remote" ps -ef | grep -F pmon
done <ip.txt
호스트 그룹을 관리하기 위한 보다 영구적인 솔루션을 원한다면 Ansible과 같은 솔루션으로 마이그레이션하는 것을 고려해보세요.