쉘 스크립트에서 whois 연결 거부 메시지 처리

쉘 스크립트에서 whois 연결 거부 메시지 처리
blacklist_ips='
    5.56.148.140
    94.73.159.66
    69.134.15.72
    107.150.42.226
    195.159.233.44
    89.19.7.58
'

for ipx in $blacklist_ips
do
    country=`whois $ipx | grep -i country | tail -1 | awk '{print $2}'`
    hostx=`host $ipx |awk '{print $NF}'|sed "s/\.$//"`
    printf '%s %s %s' $country $ipx $hostx          
    printf '\n'
done

스크립트는 모든 IP에서 작동하지만 69.134.15.72,

country=`whois $ipx | grep -i country | tail -1 | awk '{print $2}'`

결과는 다음과 같습니다.

connect: Connection refused

으니까

whois 69.134.15.72

69.134.15.72제대로 반응 하지 않는 것 같습니다 .

country왜 해당 줄에서 멈추고 스크립트 실행이 다음 줄에 도달하지 않는지 이해할 수 없습니다 .

오류를 감지 connection refused하고 올바르게 대응하는 방법은 무엇입니까?

답변1

if 문을 사용하여 이를 수행하고 echo $?마지막 명령의 종료 상태를 테스트할 수 있습니다. 숫자 0은 일반적으로 성공을 나타냅니다. 실패는 프로그램에 따라 일련의 숫자로 표시될 수 있습니다.

여기서는 whois 69.134.15.72; echo $?메시지로 인해 2가 생성됩니다 Connection Refused.

연결을 허용하는 다른 IP 주소에 대해 명령을 실행하면 0이 생성됩니다. 예를 들어:

$ whois 5.56.148.140 >/dev/null; echo $?
0

이 명령에서는 혼동을 피하기 위해 출력을 /dev/null로 리디렉션합니다. 또한 이 문서의 IP 주소에서 이 명령을 실행하는 성공 또는 실패는 향후 변경될 수 있습니다.

코드에서는 먼저 whois특정 IP 주소에 대한 명령을 테스트한 다음 종료 상태가 0인 경우에만 for 문의 나머지 부분을 실행할 수 있습니다.

그것은 다음과 같습니다:

for ipx in $blacklist_ips
do

    whois_test=`whois $ipx 2>/dev/null` 
    ret=$?

    if [ $ret -eq 0 ]; then
        country=`echo "$whois_test" | grep -i country | tail -1 | awk '{print $2}'`
        hostx=`host $ipx |awk '{print $NF}'|sed "s/\.$//"`
        printf '%s %s %s' $country $ipx $hostx          
        printf '\n'
    fi

done

여기서 구문은 다음과 같습니다.

  1. whoisIP 주소에 대해 명령을 실행하고 출력을 변수로 저장합니다 whois_test. stderr은 /dev/null로 리디렉션되며 명령이 실패하면 화면에 다른 출력이 생성되지 않습니다.
  2. 종료 상태 값을 변수에 할당합니다 ret.
  3. If 문은 변수의 값이 ret0인지 확인합니다. 그렇다면 for 루프의 내용으로 실행이 계속됩니다.

countryfor 루프의 변수 할당이 약간 변경되었습니다. 스크립트는 원래 작성된 대로 명령 출력을 파이프하는 대신 whois이제 변수 값을 파이프합니다 whois_test.

grep국가에 대한 올바른 값을 찾을 수 있도록 형식을 유지하려면 큰따옴표가 필요합니다 .

관련 정보