如何使用 bash 脚本运行 nmap 并捕获 IP 和主机名?

如何使用 bash 脚本运行 nmap 并捕获 IP 和主机名?

我想扫描我的网络;并返回如下输出:

192.168.0.* 的网络扫描

192.168.0.1 计算机1

192.168.0.2 计算机2

192.168.0.3 计算机5

echo Network Scan
nmap -sP -n <network> | awk '{print  $5}NF == 6{print $6}'

我怎样才能修改已有的代码以仅包含 IP 和主机名?

答案1

Nmap 的正常输出不适合解析,因为它因版本而异,并且不使用一致的分隔符或字段宽度。更好的方法是使用XML或者可格勒普输出。最快最简单的方法是选择 Grepable 输出-oG并将输出发送到 STDOUT 进行处理awk

nmap -sn 192.168.0.0/24 -oG - | awk '$4=="Status:" && $5=="Up" {print $2, $3}'

请注意,此命令使用新选项(自 2009 年 11 月的 Nmap 5.10BETA1 以来)-sn而不是旧选项(但仍受支持),-sP表示“仅进行主机发现”。此外,我删除了该-n选项,因为您对主机名感兴趣。如果不进行反向名称解析,您将无法获得所需的输出。

由于名称解析的工作方式(以及 Nmap 可以使用的多个名称信息源),特定 IP 地址可能有多个主机名。Grepable 输出已弃用,因为它无法传达 Nmap 生成的所有信息(例如多个主机名、NSE 脚本输出、跟踪路由信息等)。如果您想要更完整的解决方案,则应使用 XML 输出。以下是使用的示例xmlstarlet解析 XML 输出:

nmap -sn 192.168.0.0/24 -oX - | xmlstarlet sel -t -m "//host/status[@state='up']/.." -v "address[@addrtype='ipv4']/@addr" -o " " -v "hostnames/hostname/@name" -n

或者为每个主机名打印一行(包括具有多个主机名的 IP 地址):

xmlstarlet sel -t -m "//host/status[@state='up']/../hostnames/hostname" -v "../../address[@addrtype='ipv4']/@addr" -o " " -v "@name" -n

相关内容