シェルスクリプトで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

答え2

正しいトラックを使用していてもnc接続が可能かどうかをテストしたい場合は、次を使用してください。-zCNCスイッチ:

#!/bin/bash
REMOTEHOST=10.11.12.13
REMOTEPORT=1234
TIMEOUT=1

if nc -w $TIMEOUT -z $REMOTEHOST $REMOTEPORT; then
    echo "I was able to connect to ${REMOTEHOST}:${REMOTEPORT}"
else
    echo "Connection to ${REMOTEHOST}:${REMOTEPORT} failed. Exit code from Netcat was ($?)."
fi

答え3

私は答えが少し遅れていることを知っていますが、これを行う方法を探していましたが、セキュリティ上の理由からncを使用することはオプションではありません。

初期のechoに欠けているのは-eスイッチです。

   -e     enable interpretation of backslash escapes
   -E     disable interpretation of backslash escapes (default)

切断後に Telnet を終了するには、改行 + 終了コマンドを使用します。このように:

echo -e '\035\nquit' | telnet 10.0.0.1 23 && echo "success" || echo "failed"

明らかに、ブロックスタイルのifステートメントを使用して$?を評価しても同じように動作します。もともとそうでしたように:

echo -e '\035\nquit' | telnet 10.0.0.1 23
if [ $? -eq 1 ]
then
  echo "Console is down."
fi

トピックについて話している間、ncに関しては、持っているncタイプ(gnu ncatとnmap-ncat)によって異なります。 Gnuには-zスイッチがあります:

  -z                         Zero-I/O mode, report connection status only
nc -z 10.0.0.1 23
# (evaluate $? here)

もう一つはそうではありません。詰まらないようにするには、空白行をncに接続する必要があります。

echo | nc 10.0.0.1 23
# (evaluate $? here)

答え4

コマンドプロンプトでこのコマンドを実行する nc -z 192.168.10.5 23か、bashスクリプトを生成します。

接続が成功すると、次の文が返されます。

192.168.10.5ポート23 [tcp / *]に正常に接続されました!

関連情報