Bashの `/dev/udp`を使ってポートが開いているかどうかはどうすればわかりますか?

Bashの `/dev/udp`を使ってポートが開いているかどうかはどうすればわかりますか?

netcatアクセス権がないため、特殊ファイルを使用してポートをテストしてみnmapました。bash/dev/udp/

次のようにできます。

echo "" > /dev/udp/example.com/8000

ただし、UDPを使用するときは常にそうです$?。私はこれがコマンドの戻り値0のためであると仮定します。そうですか?echo ""

私は基本的にnmap私ができることを複製しようとしていますnetcat

nmap -sU -p 8000 example.com | grep open >/dev/null && echo 'open'
nc -z -u example.com 8000 && echo 'open'

どうすればいいですか/dev/udp

答え1

TCPの場合、$?接続が失敗した場合は、$?次の点を確認してください0

$ >/dev/tcp/google.com/81
bash: connect: Network is unreachable
bash: /dev/tcp/google.com/81: Network is unreachable
$ echo $?
1

bash接続が失敗したことに気づくのに時間がかかります。あなたはそれを使用することができます停止する原因bash:

$ timeout 1 bash -c '>/dev/tcp/google.com/80' &&
  echo Port open ||
  echo Port close
Port open

UDPポートテストはより複雑です。

厳密に言うとない。開いている状態(もちろんudpは無国籍プロトコル)udpを使用します。 2週間だけudpがあります。聞くまたはいいえ。状態が次の場合いいえ、あなたは得るでしょうICMPターゲットに接続できない

残念ながら、ファイアウォールまたはルータはしばしばこれらのICMPパケットを破棄するため、UDPポートのステータスを確認できません。

答え2

一般的に言えばできません。

TCPとは異なり、UDPには接続がありません。何もしないポートに接続するだけでは、TCPのようにポートが開いているかどうかを検出できません。代わりに、データをポートに送信し、何が起こっているのかを調べると、実際のUDP実装の詳細が原因で結果を解釈することは困難です。高度なパケットレベルツールでも、プログラムnmapが特定のUDPポートでリッスンしているかどうかを判断できません。 nmapUDPポートを3つのグループに分けます。

  1. 絶対オープンです。ポートにパケットを送信すると、ターゲットコンピュータでデータ応答が発生します。
  2. 閉じてください。ポートにパケットを送信すると、ターゲットコンピュータが「ICMPターゲットに接続できません」というメッセージが表示されます。
  3. 開くかフィルタリングします。ポートにパケットを送信しても応答はありません。おそらく、パケットを破棄するファイアウォールがあるかもしれませんし、聞いていますが、応答をnmap取得する方法がわからないプログラムがあるかもしれません。

関連情報