列出打开特定 TCP 端口组的主机的更好方法(Linux)

列出打开特定 TCP 端口组的主机的更好方法(Linux)

我想获取网络中所有开放了 22、80 和 443 端口的主机列表(他们三个)。目前我使用两种方法,它们都有缺点,我想知道是否还有我所忽略的更好的方法。

第一种方法

nmap -PS22 -p22,80,443 192.168.2.\* -oG - | grep "open.*open.*open"
Host: 192.168.2.250 (192.168.2.250) Ports: 22/open/tcp//ssh///, 80/open/tcp//http///, 443/open/tcp//https///

我需要将端口数与“open”一词的出现次数进行匹配。它很丑陋,很长,而且它的输出更长更丑陋

第二种方法

nmap -PS22 -p22,80,443 192.168.2.*
Nmap scan report for 192.168.2.250 (192.168.2.250)
Host is up (0.051s latency).
22/tcp open  ssh
80/tcp open  http
443/tcp open  https

这是一个比较简单的命令,但它要求我像上例一样直观地找到具有 3 行开放端口的主机。在具有大量主机的网络中,只有三个端口中的一个或两个开放,这很困难。

还有更好的办法吗?

答案1

两者都很容易解析。第二个是这样的:

nmap -PS22 -p22,80,443 192.168.2.* | awk '/^Nmap scan/ { host = $NF; gsub( /[()]/, "", host) }; /^(22|80|443)/ && $2=="open" { open=open " " $3;  ++cnt}; host && /^$/ { printf "%2s %-20s %s\n", (cnt!=3 ? "!" : "OK"), host, open; host=open=""; cnt=0}'

这将在第一列打印一个指示符(OK 或!),然后是 IP,最后是它发现打开的服务的名称。

相关内容