シェルスクリプト内でTelnetポートがアクティブかどうかをテストする


10

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

ログインプロンプトが表示される前に中断します。


回答:


14

Bashには、のような使い慣れた疑似デバイスが用意されてい/dev/nullます。ただし、ネットワーク接続のテスト/dev/tcpなどの/dev/udpために、Bashスクリプト内から使用できる他のデバイスもあります。

Bashのmanページからの抜粋

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用、Telnetはポート23を使用します。

$ 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

あなたは、特にテストに欠けている場合はtelnet、ポート23上のデフォルトの実行により、そのSLMは23 22と223、使用使用しているところということ
ワーウィック

@ウォーリック-おかげで、例のセクションにメモとして追加しました。
slm

@simコメントありがとうございます。私はこれを以前に見ましたが、これで動作させることができませんでした。私の問題は、ログインプロンプトをgrepまたはテストできるようにする必要があることです。この場合、コンソールはロックされ、ログインプロンプトは表示されません。 # telnet 192.168.10.5 Trying 192.168.10.5... Connected to 192.168.10.5 (192.168.10.5). Escape character is '^]'. Connection closed by foreign host.
rleon

# cat < /dev/tcp/192.168.10.12/23 ログインプロンプトが表示されますが、それを抜け出すことができません。
rleon、

1
うわー..そこにリダイレクトの割り当て。# cat afile ^] それを実行した後、それはちょうどにブレークをエコーし​​ていafileます。まだ遊んでいますが、もうすぐだと思います。
rleon

7

あなたはを使用して正しい軌道に乗ってncいますが、接続を確立できるかどうかを本当にテストしたい場合は、ncの-zスイッチを使用してください:

#!/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

これはすべてのシステムで機能するわけではありません。私のncには-zフラグがありません
Shapeshifter

面白い。これはどのバージョンncですか?
DopeGhoti 2016

私はCentOS 7を使用しており、ncはそのオプションのないnmap-ncatに置き換えられました:(
Shapeshifter

私が正しく思い出せば、CentOSで必要なパッケージは単純ncです。
DopeGhoti 2016

ncはcentos 7のnmap-ncatです
Shapeshifter

2

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

最初のエコーで欠けていたのは-eスイッチです。

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

また、改行+ quitコマンドで、切断後に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)

1

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

接続が成功すると、以下のステートメントが返されます。

192.168.10.5 23ポート[tcp / *]への接続に成功しました!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.