GNU/Linux >> Linux の 問題 >  >> Linux

Linux でポートが開いているかどうかを効率的にテストしますか?

最近知った驚きは、Bash が tcp 接続をファイル記述子としてネイティブにサポートしていることです。使用するには:

exec 6<>/dev/tcp/ip.addr.of.server/445
echo -e "GET / HTTP/1.0\n" >&6
cat <&6

0、1、2 は stdin、stdout、および stderr であるため、ファイル記述子として 6 を使用しています。 5 は Bash によって子プロセスに使用されることがあるため、3、4、6、7、8、および 9 は安全なはずです。

以下のコメントに従って、ローカル サーバーでのリスニングをテストするには スクリプト内:

exec 6<>/dev/tcp/127.0.0.1/445 || echo "No one is listening!"
exec 6>&- # close output connection
exec 6<&- # close input connection

誰かが聞いているかどうかを判断するには、ループバックで接続を試みます。失敗した場合は、ポートが閉じているか、アクセスが許可されていません。その後、接続を閉じます。

メールの送信、失敗時のスクリプトの終了、必要なサービスの開始など、ユースケースに合わせてこれを変更してください。


ここに「迅速な回答」の非常に短い説明があります:リモート TCP ポートがシェル スクリプトから開かれているかどうかをテストする方法は?

nc -z <host> <port>; echo $?

「リモート」アドレスとして 127.0.0.1 で使用します。

これは、ポートが開いている場合は「0」を返し、ポートが閉じている場合は「1」を返します

nc -z 127.0.0.1 80; echo $?
<ブロック引用>

-z nc がリッスン デーモンにデータを送信せずにスキャンするだけであることを指定します。このオプションを -l オプションと一緒に使用するとエラーになります。


この方法で netstat を使用すると、はるかに高速な結果を得ることができます:

Linux の場合:

netstat -lnt | awk '$6 == "LISTEN" && $4 ~ /\.445$/'

Mac の場合:

netstat -anp tcp | awk '$6 == "LISTEN" && $4 ~ /\.445$/'

これにより、ポート (この例では 445) でリッスンしているプロセスのリストが出力されるか、ポートが空いている場合は何も出力されません。


これには netcat を使用できます。

nc ip port < /dev/null

サーバーに接続し、再び接続を直接閉じます。 netcat が接続できない場合、ゼロ以外の終了コードを返します。終了コードは変数 $? に格納されます。例として、

nc ip port < /dev/null; echo $?

netcat がポートに正常に接続できた場合にのみ、0 を返します。


Linux
  1. ネットワーク接続をテストするためのポートへのTelnet

  2. リモートLinuxシステムで開いているポートを確認する方法

  3. Linux サーバーからポート [TCP/UDP] 接続をテストする方法

  1. LinuxでSSHポートを変更する方法

  2. LinuxでAppimageを開く方法

  3. Linux サーバーでポートが開いているか閉じているかを確認しますか?

  1. Linux – Raspberrypiシリアルポート?

  2. Linuxでポートを開く方法

  3. Linux ネットワーク ポートの枯渇