テキストファイルからホストとポートを継続的に読み取り、接続を作成してステータスを確認する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"
答え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"