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"

答え2

どちらのコマンドもファイルの残りの部分をtelnet読み取ろうとします。$1そのため、ループの実行回数が予期せず減少する可能性があります。

どの入力を提供したいのかわかりませんtelnet

ところで、すでにインストールされている場合は使用する方が良いですnetcat(時々とも呼ばれますnc)。入力変更の問題を解決することはできませんが、通常、この種のスクリプトのやりとりには優れたツールです。

答え3

同様のものを使用しますが、リモートアクセス用です。リダイレクトを操作できる場合は、よりきれいになります。

孤立:

ssh -q USERNAME@HOSTSERVER 'echo -e "\x1dclose\x0d" | telnet REMOTESERVER PORT'|grep Connected>/dev/null && printf "PASSED\n"||printf "FAILED\n"

ローカル:

echo -e "\x1dclose\x0d" | telnet REMOTESERVER PORT|grep Connected>/dev/null && printf "PASSED\n"||printf "FAILED\n"

関連情報