解析(可 grepable)nmap 输出以使用 awk 等文本实用程序打印 IP\t[所有开放端口] 列表

解析(可 grepable)nmap 输出以使用 awk 等文本实用程序打印 IP\t[所有开放端口] 列表

我想找到一种方法来打印每个发现至少有一个开放端口的 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 调用,或者可以增强任何调用,请进行编辑。

相关内容