열려 있는 22개 포트를 확인하는 BASH 스크립트의 WHILE 루프에 있는 IF가 실패합니다.

열려 있는 22개 포트를 확인하는 BASH 스크립트의 WHILE 루프에 있는 IF가 실패합니다.

나는 서버 목록을 실행하고 SSH 포트가 열려 있는지 확인하는 매우 기본적인 스크립트를 만들려고 합니다 nc. 나는 몇 가지 다른 것을 시도했지만 제대로 작동하지 않는 것 같습니다. 나는 어떤 종류의 스크립팅에도 능숙하지 않습니다.

여기에 스크립트가 있습니다. nc.txt의 명령에 대한 응답에서 "성공"이 확인되면 작업을 수행하기 를 원합니다 OPEN.

while read SERVER
do
OPEN=$(nc -z -v -w5 $SERVER 22)
echo $SERVER
   if [[ $OPEN = *"suc"* ]];
    then
        echo "Found SSH open on $SERVER"
    else
        echo "No open ports on $SERVER!"    
   fi
done < server.txt

서버 목록은 server.txt스크립트 끝 부분에서 참조되는 파일에 있습니다.

이것이 내가 얻은 응답입니다. 나는 아니에요

nc: connect to 10.10.51.55 port 22 (tcp) failed: No route to host
10.10.51.55
No open ports on test1!
Connection to 10.10.51.65 22 port [tcp/ssh] succeeded!
10.10.50.65
No open ports in test2!

무슨 일이 있어도 "$SERVER에 열려 있는 포트가 없습니다"라고 표시됩니다.

어떤 지침이라도 감사드립니다.

답변1

댓글, 댓글이 너무 깁니다.

  1. server.txtserver-list이름을 정 하거나 servers.txt원한다면 좋을 것입니다 .

  2. 피하고 유사한 소문자 변수 이름을 사용 하고 호스트 이름을 사용하는지 IP를 사용하는지 명확하지 않기 때문에 어쨌든 이름을 지정 SERVER하는 것이 좋습니다 .server_ip

  3. 정수가 아닌 변수는 모두 큰따옴표로 묶습니다 "$server_ip".

  4. blackhole( ) 변수 로 리디렉션하는 if대신 직접적인 설명을 사용하세요 .$OPEN/dev/null


위 내용을 바탕으로 다시 작성했습니다.

#!/bin/sh

while read -r server_ip; do

    if nc -z -v -w5 "$server_ip" 22 >/dev/null 2>&1; then
        echo "Found SSH port open on $server_ip."
    else
        echo "Did not find open SSH port on $server_ip." >&2
    fi

done < server-list

답변2

가장 간단한 해결책은 다음과 같습니다.

if nc -z -v -w5 $SERVER 22 >/dev/null 2>&1;
then
    echo "Found SSH open on $SERVER"
else
    echo "No open ports on $SERVER!"    
fi

답변3

문제는 nc진단 메시지가 출력 시 표준 오류에 기록되는 반면 명령 대체는 표준 출력만 캡처한다는 것입니다.

==에서도 사용해야 합니다 [[ ... ]]. 변수 확장은 인용되어야 하며 이상적으로는 이를 사용하여 printf변수 데이터를 출력하는 것이 좋습니다.

이는 귀하의 코드가 다음과 같을 수 있음을 의미합니다.

while IFS= read -r SERVER do
    OPEN=$( nc -z -v -w5 "$SERVER" 22 2>&1 )
    if [[ "$OPEN" == *succ* ]]; then
        printf 'Found SSH open on %s\n' "$SERVER"
    else
        printf 'No open ports on %s!\n' "$SERVER"    
    fi
done <server.txt

또는

while IFS= read -r SERVER do
    OPEN=$( nc -z -v -w5 "$SERVER" 22 2>&1 )
    case "$OPEN" in
        *succ*) printf 'Found SSH open on %s\n' "$SERVER" ;;
        *)      printf 'No open ports on %s!\n' "$SERVER"  ;;
    esac
done <server.txt

또는 다음 종료 상태를 사용할 수도 있습니다 nc.

while IFS= read -r SERVER do
    if nc -z -v -w5 "$SERVER" 22 >/dev/null 2>&1; then
        printf 'Found SSH open on %s\n' "$SERVER"
    else
        printf 'No open ports on %s!\n' "$SERVER"
    fi
done <server.txt

관련 정보