Нормальный вывод Nmap не подходит для анализа, так как он варьируется от версии к версии и не использует согласованные разделители или ширину поля. Лучшим подходом было бы использовать XML или вывод Grepable . Самым быстрым и простым для вас было бы выбрать вывод Grepable с -oG
и отправить вывод в STDOUT для обработки с помощью awk
:
nmap -sn 192.168.0.0/24 -oG - | awk '$4=="Status:" && $5=="Up" {print $2, $3}'
Обратите внимание, что эта команда использует новую (начиная с Nmap 5.10BETA1 в ноябре 2009 г.) опцию -sn
вместо старой (но все еще поддерживаемой) -sP
для обозначения «только обнаружение хоста». Также я удалил опцию -n
, так как вас интересуют имена хостов. Без обратного разрешения имен вы не сможете получить желаемый результат.
Из-за того, как работает разрешение имен (и Nmap может использовать несколько источников для информации об именах), может быть несколько имен хостов для конкретного IP-адреса. Вывод Grepable устарел, поскольку он не может передать всю информацию (такую как множественные имена хостов, выходные данные сценариев NSE, информацию о трассировке и т.д.), Которую создает Nmap. Если вы хотите более полное решение, вы должны использовать вывод 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