テキストファイルからホストとポートを継続的に読み取り、接続を作成してステータスを確認する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
は、接続がタイムアウトしたことを確認することです。これは期待どおりに機能します。
else
In -telnet $host $port
接続がタイムアウトしていないことを確認し、telnet
リモートホストに移動して接続がタイムアウトしたことを確認します。成功または拒否する。
ただし、接続時成功、スクリプトやめる突然吐き出した馬:
Escape character is '^]'.
Connection closed by foreign host.
出力ファイルに書き込んで「接続成功」と言い、$1の残りの部分を読み続けたいと思います。
接続が拒否されると、スクリプトは終了しません。期待どおりに動作します。 $1から読み続け、コマンドを実行し続けます。
使用できない状況も発生しましたnetcat
。
ベストアンサー1
〜のようにEmma Luoが指摘した。while
、telnetコマンドはループにリダイレクトされたstdin入力を吸収します。したがって、Telnet接続の1つが成功すると、予想される残りの入力は無視され、while
ループは終了します。telnet
while
この問題に対する即時の解決策は、telnet
入力をリダイレクトすることです。最も簡単な方法は、次のように/dev/nullからリダイレクトすることです。サイラスレビュー:telnet host port >> output.txt < /dev/null
。
成功した接続と拒否された接続(おそらく5秒以上の遅延)を区別するために、telnetコマンドの出力をキャプチャしてメッセージを確認しましたConnected to
。メッセージがあれば成功と見なします。それ以外の場合は失敗します。
スクリプトの主な変更点は次のとおりです。
telnet
/dev/null で両方の標準入力をリダイレクトします。- すべての変数を参照
- 比較のため
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"