web-dev-qa-db-ja.com

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
developer__c

Nmapの通常の出力は、バージョンごとに異なり、一貫した区切り文字やフィールド幅を使用しないため、解析には適していません。より良いアプローチは、 [〜#〜] xml [〜#〜] または Grepable 出力を使用することです。必要なものに対して最も速くて簡単なのは、-oGでGrepable出力を選択し、出力をSTDOUTに送信してawkで処理することです。

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

このコマンドは、古い(ただしまだサポートされている)-snの代わりに新しい(Nmap 5.10BETA1、2009年11月))-sPオプションを使用して「また、ホスト名に関心があるため、-nオプションを削除しました。名前の逆解決を行わないと、必要な出力を取得できません。

名前解決の仕組み(および複数のソースNmapは名前情報に使用できます))のため、特定のIPアドレスに複数のホスト名が存在する可能性があります。Grepable出力は使用できないため非推奨です。 Nmapが生成するすべての情報(複数のホスト名、NSEスクリプト出力、traceroute情報など)を伝達します。より完全なソリューションが必要な場合は、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
2
bonsaiviking