Назад | Перейти на главную страницу

Установка пользовательского тайм-аута для nmblookup

В рамках пакетного сценария у меня есть следующая команда:

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}".