如何为IP地址,主机,端口号,端口状态,协议,服务和服务版本(如果有的话)提醒或grep greppable Nmap输出?

时间:2016-08-24 19:32:08

标签: awk grep nmap

可映射的Nmap输出如下所示:

Host: 9.2.1.100 (hello.world.com)       Status: Up

Host: 9.2.1.100 (hello.world.com)       Ports: 21/closed/tcp//ftp///, 22/closed/tcp//ssh///,
23/closed/tcp//telnet///, 25/closed/tcp//smtp///, 80/open/tcp//http//Citrix Metaframe ICA Browser/,
110/filtered/tcp//pop3///, 139/open/tcp//netbios-ssn//Microsoft Windows netbios-ssn/,
443/closed/tcp//https///, 445/open/tcp//microsoft-ds//Windows Server 2003 3790 Service Pack 2 microsoft-ds/,
3389/open/tcp//ms-wbt-server//Microsoft Terminal Service/        Seq Index: 256       IP ID Seq: Incremental

我的问题是如何使用awk或grep来解析输出,以便我得到以下内容: IP地址,主机,端口状态(仅限开放端口),协议,服务和服务版本(如果有)?

9.2.1.100\thello.world.com\t80\topen\ttcp\thttp\tCitrix Metaframe ICA Browser\n
9.2.1.100\thello.world.com\t139\topen\ttcp\tnetbios-ssn\tMicrosoft Windows netbios-ssn\n

...

1 个答案:

答案 0 :(得分:0)

有一百万种不同的方法来解析这个输出,这可能不是最漂亮的,但我相信这应该有效:

grep 'Ports:' $1 | while read -r line
do
    ip=$(echo $line | grep -oP '(?<=^Host: )(\d{1,3}\.){3}\d{1,3}')
    name=$(echo $line | grep -Po "(?<=^Host: $ip \()[^\)]*")
    echo "$line" | grep -Po '(?<=\tPorts: )[^\t]*\t' | sed -e 's/, /\n/g' | sed -e 's%/%\t%g' | cut -d/ -f 1-3,5,7 | sed -e "s/^/$ip\t$name\t/g"
done

在此特定示例中,您必须将此代码保存到文件中,并使用包含nmap输出作为参数的文件名执行它。 无论如何,here你可以找到关于nmap命令的grepable输出的完整解释。他们甚至解释了应该如何解析,但我没有时间阅读它所以我只是在这里写了这个小脚本。 我希望你会发现这有用。