我想扫描我的网络;并返回如下输出:
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