web-dev-qa-db-ja.com

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

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

10
rleon

ncを使用して正しい方向に進んでいますが、接続を確立できるかどうかをテストするだけの場合は、 nc's -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
7
DopeGhoti

私は答えが少し遅れていることを知っていますが、これを行う方法を探していて、セキュリティ上の理由から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)
2
Alex B

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

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

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

1
Joshua Waiswa