Проверка доступности хоста с помощью 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 $?
# 2
0 означает, что хост доступен
2 означает недостижимый
вам не нужны backticks в операторе if. Вы можете использовать эту проверку
if ping -c 1 some_ip_here &> /dev/null
then
echo 1
else
echo 0
fi
команда if проверяет код выхода следующей команды (ping). Если код выхода равен нулю (что означает, что команда вышла успешно), блок then будет выполнен. Если он возвращает ненулевой код выхода, то блок 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