我有一个 nmap 脚本,可以在 IP 列表上运行开放中继测试。最初,如果发现主机具有命令中指定端口的开放端口,我必须仅返回主机名和 IP,但这似乎不准确,因为开放端口并不意味着 NSE 测试是成功的。所以,我想在一行中返回主机名和 IP + NSE 结果。
我使用的命令是:
nmap --script smtp-open-relay.nse --open -p 25,2525,587,465,2526 -iL ./short_servers_list.txt
该命令的示例输出为:
*从 Nmap 6.40 开始(http://nmap.org) 于 2017-08-08 07:25 PDT
Nmap 扫描报告foo01.bar.com (10.10.10.1)
主机已启动(0.0020 秒延迟)。
未显示:3 个封闭端口
港口国服务
25/tcp 打开smtp
|_smtp-open-relay:服务器是开放中继(5/16 测试)
2526/tcp 开放未知
Nmap 扫描报告foo02.bar.com (10.10.10.2)
主机已启动(0.082 秒延迟)。
未显示:4 个封闭端口
港口国服务
25/tcp 打开smtp
|_smtp-open-relay:SMTP EHLO nmap.scanme.org:接收数据失败:连接已关闭
Nmap 完成:2.16 秒内扫描 10 个 IP 地址(最多 6 个主机)*
我需要输出以下内容:
foo01.bar.com (10.10.10.1) smtp-open-relay:服务器是开放中继(5/16 测试)
foo02.bar.com (10.10.10.2) smtp-open-relay: SMTP EHLO nmap.scanme.org: 接收失败
我如何使用常见的 bash 工具/命令(grep 或 sed 等)来做到这一点?
答案1
和awk:
nmap --script smtp-open-relay.nse --open -p 25,2525,587,465,2526 -iL ./short_servers_list.txt \
| awk '/^ *Nmap scan report/{ sub(/^ *Nmap scan report for */, "", $0); printf "%s ",$0 }
/_smtp-open-relay/{ sub(/^ *\|_/, "", $0); print $0 }'