В рамках пакетного сценария у меня есть следующая команда:
hostname=$(nmblookup -A $ip_address | awk '$2 == "<20>" {print $1}')
Что отлично работает с точки зрения функциональности, даже для неразрешенных хостов.
Проблема в том, что когда IP-адрес недоступен или удаленная машина не отвечает на запрос SMB, выполнение команды занимает около десяти секунд. Поэтому вопрос прост: есть ли способ уменьшить затраченное время в таких случаях? Или, другими словами, есть ли способ установить собственный тайм-аут для nmblookup
команда?
НОТА: Меня интересуют решения, которые не использовать SIGALRM
или аналогичные механизмы; если они существуют. В nmblookup
версия 3.6.3
из Ubuntu 12.04 LTS.
Я не думаю, что оператор if будет работать, потому что nmap возвращает ноль, если выполняется без ошибок, независимо от того, открыт ли порт на каком-либо хосте. Попробуйте выполнить следующий синтаксический анализ вывода nmap, подставив любой диапазон IP-адресов, который вам нужен:
for ip_address in $(nmap -p 137 192.168.0.0/24 -oG - | grep netbios |grep -v closed | awk '{print $2}')
do
hostname=$(nmblookup -A $ip_address | awk '$2 == "<20>" {print $1}')
echo "$ip_address: $hostname"
done
Я просто использую
timeout 1 nmblookup -A $ip_address
Он убивает nmblookup при запуске более 1 секунды.
Обойти nmblookup(1)
ограничение:
if (nmap -p "${port} -sU -P0 "${ip_address}" &> /dev/null); then
hostname=$(nmblookup -A $ip_address | awk '$2 == "<20>" {print $1}')
else
printf "Host unreachable.\n"
fi
Я предполагаю, что вам нужно проверить netbios-ns 137/udp
, измените тест, чтобы использовать соответствующие параметры и "${port}"
.