シェルスクリプトでTelnetポートが有効になっているかどうかをテストする

シェルスクリプトでTelnetポートが有効になっているかどうかをテストする

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のマニュアルページから

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

おすすめ記事