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


12

非常に限られた一連のコマンドとディスク容量を備えた多数のLinuxボックスがあります。しかし、それにはtelnetコマンドがあります。

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

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

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

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

では、1行のコマンドを実行して、telnetを使用してマシンに接続し、その後切断する方法を教えてください。


私が理解しているように、Telnetクライアントは直接送信をサポートしていませんか?
IBr 2013

@IBr、どういう意味ですか?
Muhammad Gelbana 2013

テレントクライアントは、クライアント側のexitコマンドを使用して終了した後に報告される終了コードが異なることに注意してください。したがって、ゼロの終了コードは、ポートが開かれているシグナルとは見なされません。少なくともRHELテレントRPMでは機能しません。
OliverGondža2017年

回答:


28

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

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

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


動作する可能性がありますが、馬鹿げているようです-Telnetには、最初の連絡時に終了するか何かをするオプションがあるはずです
Alexander Mills

10

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

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

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

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

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

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

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

これは完璧に動作します!出力は確かにリダイレクトされていますが、「外部ホストによって接続が閉じられました」というメッセージが表示されることに気づきました。output.logファイルではなく、スリープ後にコンソールに出力します。これを防ぐ方法はありますか?
dnLL

5

私の場合、これはうまくいきます。(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

1
ねえ、これは素晴らしいです。私は自分の仕事ですべてのLinuxシステムのユーザーですが、管理者ではありません(管理者権限はありません)。私は、ネットワーク接続をテストできるように常にtelnetをインストールするように彼らに頼むのはうんざりです(私はネットワークエンジニアです)。これは優れた回避策です。Telnetのように実行するために少し変更しました。私はここに修正を加えて自分の答えを提供しました。
theglossy1 2017年

3

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

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


今すぐnetcatをインストールしようとしていますが、インストールできません。コンパイル済みのpowerpcバージョンをダウンロードしましたが、glibcライブラリがありませんでした。コンパイル済みのpowerpcバージョンをダウンロードしましたが、デバイスにライブラリファイルをコピーするための十分なスペースがありませんでした!glibcライブラリがすでに存在しているが、netcatがそれを見つけられない可能性はありますか?
Muhammad Gelbana 2013

Netcatはクライアント側でのみ必要です。サーバー(プローブ)では同じプレーンな古いtelnetを使用できます。
IBr 2013

また、Glibcはすでに存在しているはずです。通常のシステムでは、多くのもので使用されています。
IBr 2013

telnetスクリプトに追加し&& exitて、接続が切断されているかどうかを確認してください(少なくともsshでは十分です)。
IBr 2013

&& exitうまくいきませんでした。glibcが存在するはずであり、存在すると私が信じている場合。nc.traditional不足しているように不満を言うのはなぜですか?
Muhammad Gelbana 2013

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

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

( 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で動作します


0

試して

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

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


0

カスタムルートがある場合は、ルーティングルールに従わないため、netcatを使用しないでください。どのようにと同様にnslookupdighost(/ etc / hostsファイルを無視nslookupを、掘る、Firefoxの無視して/ etc / hostsファイルのエントリ)。

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

nc -w 3 -s 192.168.1.12 example.com 8080

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

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