Обработка сообщения whois отказалось от сообщения в сценарии оболочки

blacklist_ips=' 5.56.148.140 94.73.159.66 69.134.15.72 107.150.42.226 195.159.233.44 89.19.7.58 ' for ipx in $blacklist_ips do country=`whois $ipx | grep -i country | tail -1 | awk '{print $2}'` hostx=`host $ipx |awk '{print $NF}'|sed "s/\.$//"` printf '%s %s %s' $country $ipx $hostx printf '\n' done 

Скрипт работает для всех IP-адресов, но для 69.134.15.72 ,

 country=`whois $ipx | grep -i country | tail -1 | awk '{print $2}'` 

результаты как:

 connect: Connection refused 

Это из-за

 whois 69.134.15.72 

Кажется, 69.134.15.72 не отвечает должным образом.

Я не понимаю, почему он останавливается на линии country а выполнение скрипта не доходит до следующей строки.

Как я могу обнаружить ошибку connection refused и отреагировать правильно?

One Solution collect form web for “Обработка сообщения whois отказалось от сообщения в сценарии оболочки”

Вы можете сделать это, используя оператор if и echo $? для проверки статуса выхода последней команды. Число 0 обычно соответствует успеху. Отказы могут быть представлены рядом чисел, в зависимости от программы.

Здесь whois 69.134.15.72; echo $? whois 69.134.15.72; echo $? выдает 2 из-за сообщения о Connection Refused .

Выполнение команды для другого IP-адреса, принимающего соединение, приведет к 0. Например:

 $ whois 5.56.148.140 >/dev/null; echo $? 0 

В этой команде я перенаправил вывод в / dev / null, чтобы избежать беспорядка. Кроме того, успех или отказ этой команды от этих IP-адресов в этом сообщении могут измениться в будущем.

В вашем коде вы можете сначала проверить команду whois для конкретного IP-адреса, а затем запустить остальную часть инструкции for, если статус выхода равен 0.

Что-то вроде:

 for ipx in $blacklist_ips do whois_test=`whois $ipx 2>/dev/null` ret=$? if [ $ret -eq 0 ]; then country=`echo "$whois_test" | grep -i country | tail -1 | awk '{print $2}'` hostx=`host $ipx |awk '{print $NF}'|sed "s/\.$//"` printf '%s %s %s' $country $ipx $hostx printf '\n' fi done 

Синтаксис здесь выглядит следующим образом:

  1. Запускает команду whois по IP-адресу и сохраняет выход как переменную whois_test . stderr будет перенаправлен на / dev / null, не создавая дополнительного вывода на экране при сбое команды.
  2. Назначает значение статуса выхода переменной ret .
  3. Если оператор проверяет, является ли значение переменной ret равным 0. Если это так, оно продолжается с содержимым вашего цикла for.

Назначение переменной country внутри цикла for изменилось незначительно. Вместо того, чтобы конвейер в выводе команды whois как было изначально написано, теперь скрипт теперь whois_test на whois_test переменной whois_test .

Для сохранения форматирования необходимы двойные кавычки, чтобы grep правильно находил правильное значение для страны.

  • Для вывода weird
  • Как проверить ввод соответствует определенному формату
  • Как я могу получить пять секунд данных, добавленных в конец файла?
  • Должны ли скрипты оболочки работать в абсолютных или относительных путях?
  • сравнить два поля в двух разных файлах
  • проверять количество записей в заголовке
  • Почему команда exit не выходит из вложенного цикла?
  • синтаксическая ошибка возле неожиданного токена `('
  • как получить строку между фигурными скобками вместе со строкой без фигурных скобок, используя awk
  • Как проверить файлы ~ application / x-trash
  • Разделение имен переменных из строк вывода без пробелов
  • Linux и Unix - лучшая ОС в мире.