web-dev-qa-db-ja.com

1行のコマンドを実行して、telnetを使用してリモートTCPポートをテストする

私は非常に限られた一連のコマンドとディスク容量を持つ多数のLinuxボックスを持っています。ただし、telnetコマンドが含まれています。

これらの各プローブにリモートで(プログラムで)接続し、SSHを介してlinuxコマンドを1行発行します。

Telnetを使用して特定のマシンに接続するには、単一のコマンドを実行する必要がありますそしてすぐに切断します

私はそれをすべて行うことができますが、すぐに切断の部分です。 Telnetはある種のコンソールまたはターミナルを開き、1行のコマンドでtelnetコマンドを実行してすぐに切断することができません。

これを行うと、指定したポートでマシンに接続できないというエラーメッセージのテキスト出力を簡単に解析でき、まさにそれが私が探しているものです。

では、1行のコマンドを実行して、telnetを使用してマシンに接続し、後で切断するにはどうすればよいですか?

12

exitコマンドをtelnetのSTDINにパイプできるようにする必要があります。試してください:

echo 'exit' | telnet {site} {port}

それが機能するかどうかを確認します。 (私のWebサーバーで動作するようですが、YMMV)。

28
Charles Newey

最も簡単で簡単な方法を以下に示します。

 sleep <n> | telnet <server> <port>

n-自動終了までの待ち時間(秒単位)。 0.5のように小数にすることもできます。指定された待機時間内に必要な出力が返されない場合があることに注意してください。したがって、それに応じて増加する必要があるかもしれません。

server-ターゲットサーバーのIPまたはホスト名。

port-ターゲットサービスのポート番号。

次のように出力をファイルにリダイレクトすることもできます。

sleep 1 | telnet <server> <port> > output.log
10
Seff

私の場合、これでうまくいきます。 (CentOS 7):

while read Host port; do
r=$(bash -c 'exec 3<> /dev/tcp/'$Host'/'$port';echo $?' 2>/dev/null)
if [ "$r" = "0" ]; then
     echo "$Host $port is open"
else
     echo "$Host $port is closed"
     exit 1 # To force fail result in ShellScript
fi
done
5
Chuss

コマンドを直接送信し、出力を取得するためのより良いツールはnetcatだと思います。単純ですが、ポートを介してコマンドを配置するための強力なツールです。このスーパーユーザーの質問で使用例を見ることができます: https://superuser.com/questions/261900/how-can-i-pipe-commands-to-a-netcat-that-will-stay-alive -askerは、数秒後に接続が閉じる実際の例を示します。

接続をテストしたいだけなら、これを使用してください: http://terminalinflection.com/use-netcat-not-telnet-to-test-network-connectivity/

3
IBr

これは 上記の回答 のもう1つのバージョンで、「通常の」Telnet構文のように機能します。私の答えが気に入ったら、これではなく元の答えに賛成投票してください。

#!/bin/bash
if [ "$2" == "" ]; then
 echo "Syntax: $0 <Host> <port>"
 exit;
fi

Host=$1
port=$2

r=$(bash -c 'exec 3<> /dev/tcp/'$Host'/'$port';echo $?' 2>/dev/null)
if [ "$r" = "0" ]; then
     echo "$Host $port is open"
else
     echo "$Host $port is closed"
     exit 1 # To force fail result in ShellScript
fi
1
theglossy1

これが私がインターネットで見つけた解決策です:

( echo open 127.0.0.1 23
sleep 5
echo your_login
sleep 5
echo your_password
sleep 5
echo hostname
sleep 5
echo exit ) | telnet

SunOSとHP-UXで動作します

1
Vladimir

試す

echo -e '\x1dclose\x0d' | telnet {HOSTNAME} {PORT}

上記の最も良い部分は、終了ステータスも取得できることです。 telnetが成功した場合、終了コードは0またはそれ以外の場合は1になります。

0
Abhishek Kumar

カスタムルートがある場合は、ルーティングルールに従わないため、netcatを避けます。 nslookupDigHostが/ etc/hostsファイルを無視する方法と同様( nslookup、Dig、firefoxが/ etc/hostsを無視する)ファイルエントリ )。

つまり、telnet/dev/tcpなどのアプリケーションやツールとは異なり、1行を実行してtelnetを使用してリモートTCPポートをテストするcommand )はシステムのルーティングルールに従い、-sでソースIPアドレスを使用するように特に指示されない限り、ncはデフォルトゲートウェイを使用します。

nc -w 3 -s 192.168.1.12 example.com 8080

アプリケーションがリソースに到達できるかどうかをテストする必要があり、ルートがダウンしている場合、テストでソースアドレスが指定されているため、netcatはすべて正常であると報告しました。 /dev/tcp に切り替えています。

0
legatoproteus