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