Como posso usar um script bash para executar o nmap e capturar tanto IP quanto hostname?

1

Eu quero verificar minha rede; e retornar uma saída como esta:

Digitalização em rede para 192.168.0. *

192.168.0.1 computer1

192.168.0.2 computer2

192.168.0.3 computer5

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

Como posso modificar o código que eu já tenho para incluir apenas o IP e o nome do host?

    
por developer__c 01.05.2013 / 11:19

1 resposta

2

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
    
por 01.05.2013 / 19:19