A saída normal do Nmap não é adequada para análise, pois varia de versão para versão e não usa delimitadores consistentes ou larguras de campo. Uma abordagem melhor seria usar o XML ou o Faça a saída possível. O mais rápido e simples para o que você deseja seria escolher a saída Grepable com -oG
e enviar a saída para STDOUT para ser processada com awk
:
nmap -sn 192.168.0.0/24 -oG - | awk '$4=="Status:" && $5=="Up" {print $2, $3}'
Observe que este comando usa a nova opção (% Nmap 5.10BETA1 em novembro de 2009) -sn
em vez do antigo (mas ainda suportado) -sP
para significar "somente a descoberta de host". Além disso, removi a opção -n
, pois você está interessado em nomes de host. Sem fazer a resolução reversa de nomes, você não poderá obter a saída desejada.
Por causa da maneira como a resolução de nomes funciona (e as múltiplas fontes que o Nmap pode usar para informações de nome), pode haver mais de um nome de host para um endereço IP específico. A saída Grepable é obsoleta porque não pode transmitir todas as informações (como vários nomes de host, saída de script NSE, informações de traceroute, etc) que o Nmap produz. Se você quiser uma solução mais completa, você deve usar a saída XML. Aqui está um exemplo usando xmlstarlet
para analisar a saída 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
Ou para imprimir uma linha para cada nome de host (incluindo endereços IP com vários nomes de host):
xmlstarlet sel -t -m "//host/status[@state='up']/../hostnames/hostname" -v "../../address[@addrtype='ipv4']/@addr" -o " " -v "@name" -n