Telnet経由でログインできるかどうかをテストするためのスクリプトを作成しようとしています。実際にログインしたくないので、期待する必要はありません。ログインプロンプトを受信できることを確認したいと思います。これはLinuxシステムで行われているため、次のことを試みましたnc
。
nc 192.168.10.5 23 -w 1 | grep -q login
if [ $? -eq 1 ]
then
echo "console is down"
fi
問題は、これによりコンソールがロックされることです。実際に-w
接続が切断されているようではありません。
また、Telnetを試してみましたが、スクリプトを切断できませんでした。努力する
\echo "\035" | telnet 192.168.10.5
ログインプロンプトが表示される前に中断されます。
ベストアンサー1
Bashはのようなおなじみの擬似デバイスを提供します。ただし、Bashスクリプトでも使用できるネットワーク接続テスト用の/dev/null
デバイスもあります。/dev/tcp
/dev/udp
Bashは、次の表に示すように、リダイレクトで複数のファイル名を使用するときに特に複数のファイル名を処理します。
/dev/fd/fd If fd is a valid integer, file descriptor fd is duplicated. /dev/stdin File descriptor 0 is duplicated. /dev/stdout File descriptor 1 is duplicated. /dev/stderr File descriptor 2 is duplicated. /dev/tcp/host/port If host is a valid hostname or Internet address, and port is an integer port number or service name, bash attempts to open a TCP connection to the corresponding socket. /dev/udp/host/port If host is a valid hostname or Internet address, and port is an integer port number or service name, bash attempts to open a UDP connection to the corresponding socket.
はい
私はドメインのSkinnerというホストへの接続をテストしており、そのホストのポート22に接続できることを確認しています。
メモ:ポート 22 は SSH に使用され、ポート 23 は Telnet に使用されます。
$ echo > /dev/tcp/skinner/22 && echo "it's up" || echo "it's down"
it's up
いいですね。ポートではないことを試してみましょう。
$ echo > /dev/tcp/skinner/223 && echo "it's up" || echo "it's down"
bash: connect: Connection refused
bash: /dev/tcp/skinner/223: Connection refused
it's down
さて、これはうまくいきますが、出力は非常に見苦しいです。大丈夫です。サブシェルで実行し、echo > /dev/tcp/...
すべての出力をにリダイレクトして/dev/null
少しクリーンアップできます。以下は、シェルスクリプトで使用できるパターンです。
$ (echo > /dev/tcp/skinner/22) > /dev/null 2>&1 \
&& echo "it's up" || echo "it's down"
it's up
$ (echo > /dev/tcp/skinner/223) > /dev/null 2>&1 \
&& echo "it's up" || echo "it's down"
it's down