Ответ 1
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 означает недостижимый
Я хочу написать script, который будет проверять, действительно ли какое-либо из устройств в сети, которое должно быть онлайн в течение всего дня, действительно онлайн. Я пытался использовать ping, но
if [ "`ping -c 1 some_ip_here`" ]
then
echo 1
else
echo 0
fi
дает 1
независимо от того, вводя допустимый или неверный IP-адрес. Как я могу проверить, отключен ли какой-либо адрес (или лучше любого из устройств из списка ip-адресов)?
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 означает недостижимый
Вам не нужны обратные ссылки в инструкции if. Вы можете использовать эту проверку
if ping -c 1 some_ip_here &> /dev/null
then
echo 1
else
echo 0
fi
Команда if проверяет код выхода следующей команды (пинг). Если код выхода равен нулю (что означает, что команда завершена успешно), тогда будет выполнен блок. Если он вернет ненулевой код выхода, будет выполнен блок 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 или имя хоста, замените команды эха на то, что нужно сделать в любом случае.
Код выше будет успешным, возможно, попробуйте с IP или именем хоста, которое, как вы знаете, недоступно.
Вот так:
ping -c 1 google.com &> /dev/null && echo success || echo fail
и этот
ping -c 1 lolcatz.ninja &> /dev/null && echo success || echo fail
FYI, Я просто сделал несколько тестов, используя вышеописанный метод, и если мы используем multi ping (10 запросов)
ping -c10 8.8.8.8 & > /dev/null; echo $?
результат команды multi ping будет "0", если хотя бы один из результатов ping достигнут, и "1", если все запросы ping недоступны.
up=`fping -r 1 $1 `
if [ -z "${up}" ]; then
printf "Host $1 not responding to ping \n"
else
printf "Host $1 responding to ping \n"
fi