
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
答え2
正しいトラックを使用していてもnc
接続が可能かどうかをテストしたい場合は、次を使用してください。-z
CNCスイッチ:
#!/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 / *]に正常に接続されました!