![解析(可 grepable)nmap 输出以使用 awk 等文本实用程序打印 IP\t[所有开放端口] 列表](https://linux22.com/image/90214/%E8%A7%A3%E6%9E%90%EF%BC%88%E5%8F%AF%20grepable%EF%BC%89nmap%20%E8%BE%93%E5%87%BA%E4%BB%A5%E4%BD%BF%E7%94%A8%20awk%20%E7%AD%89%E6%96%87%E6%9C%AC%E5%AE%9E%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%89%93%E5%8D%B0%20IP%5Ct%5B%E6%89%80%E6%9C%89%E5%BC%80%E6%94%BE%E7%AB%AF%E5%8F%A3%5D%20%E5%88%97%E8%A1%A8.png)
我想找到一种方法来打印每个发现至少有一个开放端口的 IP 地址,打印该 IP 地址,后跟以逗号分隔的开放端口列表。端口和 IP 地址应使用制表符分隔符分隔。
我可以用一种丑陋的方式做到这一点,只 grep ip 地址,将其写入文件,然后使用 ip 地址结果文件作为输入文件再次 grep nmap 文件,然后使用 cut 和 sed 修剪开放端口,将其写入文件,然后加入两个文件。这是一个丑陋的过程,并且对于边缘情况来说它不能可靠地工作。
有没有一种简单的方法可以用 awk 在一行中完成此操作?我想我需要 awk 中有一个函数来查找所有开放端口并返回它们,以便它们可以与 IP 地址一起打印,但我还没有找到如何做到这一点。
源数据示例:
Host: 10.0.0.101 ()Ports: 21/closed/tcp//ftp///, 22/closed/tcp//ssh///, 23/closed/tcp//telnet///, 25/closed/tcp//smtp///, 53/closed/tcp//domain///, 110/closed/tcp//pop3///, 139/open/tcp//netbios-ssn///, 143/closed/tcp//imap///, 445/open/tcp//microsoft-ds///, 3389/closed/tcp//ms-wbt-server///
预期输出数据:
10.0.0.101 139,445
答案1
这个awk
程序应该这样做:
$ echo "Host: 10.0.0.101 ()Ports: 21/closed/tcp//ftp///, 22/closed/tcp//ssh///, 23/closed/tcp//telnet///, 25/closed/tcp//smtp///, 53/closed/tcp//domain///, 110/closed/tcp//pop3///, 139/open/tcp//netbios-ssn///, 143/closed/tcp//imap///, 445/open/tcp//microsoft-ds///, 3389/closed/tcp//ms-wbt-server///" |
awk '{printf "%s\t", $2;
for (i=4;i<=NF;i++) {
split($i,a,"/");
if (a[2]=="open") printf ",%s",a[1];}
print ""}' |
sed -e 's/,//'
10.0.0.101 139,445
在您编辑问题之前,我假设您的输出将来自 shell nmap
,所以我准备了这个答案:
$ nmap -sT 127.0.0.1-3 |
awk '/^Nmap scan report/{cHost=$5;}
/open/ { split($1,a,"/"); result[cHost][a[1]]=""}
END {
for (i in result) {
printf i;
for (j in result[i])
printf ",%s", j ;
print ""} }' |
sed -e 's/,/\t/'
localhost 445,25,139,631,22,80
127.0.0.2 445,139,22,80
127.0.0.3 445,139,22,80
如果您需要对它们进行解释,请发表评论。如果您可以帮助消除尾随的 sed 调用,或者可以增强任何调用,请进行编辑。