開いている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を使用するかは不明であるため、とにかく名前を付けることをお勧めしますSERVERserver_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

関連情報