Telnet 接続を停止する bash スクリプト

Telnet 接続を停止する bash スクリプト

テキストファイルからホストとポートを継続的に読み取り、接続を作成してステータスを確認するbashスクリプトがあります。

私のコードは次のとおりです

while IFS=";" read -r host ports
do
    eval "arr=($ports)"
    for port in "${arr[@]}";
    do
        echo "connecting to $host on port $port" >> output.txt
        timeout 5s telnet $host $port
        exit_status=$?
        if [[ $exit_status -eq 124 ]]; then
            echo "$host on $port has timed out" >> output.txt
        else
            telnet $host $port >> output.txt
        fi
    echo "---------------------------------------------" >> output.txt
    done
done < "$1"

1つ目ifは、接続がタイムアウトしたことを確認することです。これは期待どおりに機能します。

elseIn -telnet $host $port接続がタイムアウトしていないことを確認し、telnetリモートホストに移動して接続がタイムアウトしたことを確認します。成功または拒否する

ただし、接続時成功、スクリプトやめる突然吐き出した馬:

Escape character is '^]'.
Connection closed by foreign host.

出力ファイルに書き込んで「接続成功」と言い、$1の残りの部分を読み続けたいと思います。

接続が拒否されると、スクリプトは終了しません。期待どおりに動作します。 $1から読み続け、コマンドを実行し続けます。

使用できない状況も発生しましたnetcat

ベストアンサー1

〜のようにEmma Luoが指摘した。while、telnetコマンドはループにリダイレクトされたstdin入力を吸収します。したがって、Telnet接続の1つが成功すると、予想される残りの入力は無視され、whileループは終了します。telnetwhile

この問題に対する即時の解決策は、telnet入力をリダイレクトすることです。最も簡単な方法は、次のように/dev/nullからリダイレクトすることです。サイラスレビューtelnet host port >> output.txt < /dev/null

成功した接続と拒否された接続(おそらく5秒以上の遅延)を区別するために、telnetコマンドの出力をキャプチャしてメッセージを確認しましたConnected to。メッセージがあれば成功と見なします。それ以外の場合は失敗します。

スクリプトの主な変更点は次のとおりです。

  1. telnet/dev/null で両方の標準入力をリダイレクトします。
  2. すべての変数を参照
  3. 比較のためelse出力キャプチャと検査telnet

更新されたスクリプト:

#!/bin/bash
while IFS=";" read -r host ports
do
    eval "arr=($ports)"
    for port in "${arr[@]}";
    do
        echo "connecting to $host on port $port" >> output.txt
        timeout 5s telnet "$host" "$port" < /dev/null
        exit_status=$?
        if [[ "$exit_status" -eq 124 ]]; then
            echo "$host on $port has timed out" >> output.txt
        else
            output="$(telnet "$host" "$port" 2>&1 < /dev/null)"
            case $output in
              (*Connected\ to\ *)
                echo "connection is successful to $host $port" >> output.txt
                ;;
              (*)
                echo "connection was refused to $host $port" >> output.txt
                ;;
             esac
        fi
        echo "---------------------------------------------" >> output.txt
    done
done < "$1"

おすすめ記事