解析Nmap结果BASH

时间:2015-02-26 10:05:47

标签: bash grep ip nmap

我正在写一个BASH脚本。从命令行我可以调用nmap,我想提取特定端口的IP。

$ nmap [ip]/24

Starting Nmap 6.47 ( http://nmap.org ) at 2015-02-26 01:59 PST
Nmap scan report for 192.168.56.1
Host is up (0.0012s latency).
Not shown: 500 closed ports, 499 filtered ports
PORT     STATE SERVICE
3689/tcp open  rendezvous

Nmap scan report for 192.168.56.101
Host is up (0.00042s latency).
Not shown: 998 closed ports
PORT   STATE SERVICE
21/tcp open  ftp
22/tcp open  ssh

我想要端口21的IP地址。在这个例子中,它将是192.168.56.101。如何从此返回中提取并将其保存到变量?感谢

3 个答案:

答案 0 :(得分:5)

您可以使用xml输出并使用xmllint解析输出:

nmap -p 21 -oX - "$IP"/24 | xmllint --xpath '//port[@portid="21"]/state[@state="open"]/../../../address/@addr' -

答案 1 :(得分:1)

Nmap的正常输出是人类可读的,但可以从版本更改为版本。它不是设计为机器可解析的。 Nmap有2种机器可解析的输出格式,更适合。首先,XML output(使用-oX选项)是最完整的格式,包含与正常输出相同或更多的信息。您可以使用xmlstarletxmllint解析此内容。

简单提取基本端口扫描信息的另一个流行选项是官方弃用Grepable output format-oG)。这种格式缺少许多“更新”的功能,如NSE脚本输出和traceroute信息,但它对端口扫描数据是稳定的。以下是您使用此格式的方法:

nmap $target -oG - | awk '/ 21\/open\/tcp/{print $2}'

答案 2 :(得分:0)

循环输出中的每一行,并查看字符串"Nmap scan report for <your ip address>",然后继续循环输出的每一行,直到找到行"21/tcp open ftp" 你找到一个空行或输出的结尾。

可以使用Bash builtin commands readwhile完成循环。