Проверка доступности хоста с помощью ping в сценариях bash
Я хочу написать сценарий, который будет продолжать проверять, действительно ли какие-либо устройства в сети, которые должны быть в сети в течение всего дня, находятся в сети. Я пытался использовать ping, но
if [ "`ping -c 1 some_ip_here`" ]
then
echo 1
else
echo 0
fi
дает 1 независимо от того, ввожу ли я действительный или недопустимый ip-адрес. Как я могу проверить, если конкретный адрес (или лучше любой из устройств из списка ip-адресов) перешел в автономный режим?
6 ответов:
Ping возвращает различные коды выхода в зависимости от типа ошибки.
ping 256.256.256.256 ; echo $? # 68 ping -c 1 127.0.0.1 ; echo $? # 0 ping -c 1 192.168.1.5 ; echo $? # 20 означает, что хост доступен
2 означает недостижимый
вам не нужны обратные кавычки в операторе if. Вы можете использовать эту проверку
if ping -c 1 some_ip_here &> /dev/null then echo 1 else echo 0 fiкоманда if проверяет код выхода следующей команды (ping). Если код выхода равен нулю (что означает, что команда завершилась успешно), то блок будет выполнен. Если он возвращает ненулевой код выхода, то блок else будет выполнен.
существует расширенная версия ping - "fping", которая дает возможность определить время ожидания в миллисекундах.
#!/bin/bash IP='192.168.1.1' fping -c1 -t300 $IP 2>/dev/null 1>/dev/null if [ "$?" = 0 ] then echo "Host found" else echo "Host not found" fi
Я могу придумать один лайнер как это запустить
ping -c 1 127.0.0.1 &> /dev/null && echo success || echo failзамените 127.0.0.1 на IP или имя хоста, замените команды echo на то, что нужно сделать в любом случае.
код выше будет успешным, возможно, попробуйте с IP или именем хоста вы знаете, что это не доступно.
такой:
ping -c 1 google.com &> /dev/null && echo success || echo failи
ping -c 1 lolcatz.ninja &> /dev/null && echo success || echo fail
к вашему сведению, Я просто сделал некоторые тесты, используя метод выше, и если мы используем multi ping (10 запросов)
ping-c10 8.8.8.8 &> /dev / null ; echo $?
результат команды multi ping будет "0", если хотя бы один из результатов ping достижим, и "1" в случае, когда все запросы ping недоступны.
up=`fping -r 1 ` if [ -z "${up}" ]; then printf "Host not responding to ping \n" else printf "Host responding to ping \n" fi
Comments