使用bash的`/ dev / udp`,我怎么知道端口是否打开?


14

我没有访问netcatnmap因此我试图使用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
UDP不能保证传递,因此即使bash认为成功发送了消息,消息也可能在途中被破坏了。您如何测试发送失败(不是连接失败:UDP不是连接)?
吉尔斯(Gillles)“所以-别再邪恶了”

Answers:


13

对于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是无状态协议)。这里是只有两个UDP状态,。如果状态不是,您将收到ICMP Destination Unreachable

不幸的是,防火墙或路由器通常会丢弃那些ICMP数据包,因此您将无法确定udp端口的状态。


改写我的问题,将重点放在UDP上。我为忍者道歉。我认为这将是相似的,因此没有区别。感谢您清理它。
Belmin Fernandez

10

一般来说,您不能。

与TCP不同,UDP是无连接的。您无法像通过TCP那样通过虚连接来检测端口是否打开。相反,您需要将数据发送到端口并查看会发生什么情况,并且在现实世界中实现的UDP的详细信息使解释结果变得困难。甚至复杂的数据包级工具nmap也无法确定是否存在某个程序正在侦听给定的UDP端口。 nmapUDP端口分为三类:

  1. 绝对开放。将数据包发送到端口会引起目标计算机的数据响应。
  2. 绝对关闭。将数据包发送到端口会引起目标计算机发出“ ICMP Destination Unreachable”消息。
  3. 打开或过滤。向端口发送数据包不会引起任何响应。也许有一个防火墙正在丢弃数据包。也许有一个程序正在监听,但nmap还没有弄清楚如何获得响应;也许用户只是不幸而所有的数据包在传输中都丢失了。

有关的重要信息nmap。谢谢,这澄清了很多混乱。
Belmin Fernandez
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.