IP 주소를 하나씩 읽은 다음 해당 서버의 특정 위치를 확인해야 합니다.

IP 주소를 하나씩 읽은 다음 해당 서버의 특정 위치를 확인해야 합니다.

다음 세부 정보가 포함된 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

-nwith 옵션을 사용하면 ssh출력의 나머지 부분을 읽을 수 없습니다 awk.

-Foption을 사용하면 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과 같은 솔루션으로 마이그레이션하는 것을 고려해보세요.

관련 정보