Проверка доступности хоста с помощью ping в сценариях bash



Я хочу написать сценарий, который будет продолжать проверять, действительно ли какие-либо устройства в сети, которые должны быть в сети в течение всего дня, находятся в сети. Я пытался использовать ping, но



if [ "`ping -c 1 some_ip_here`" ]
then
echo 1
else
echo 0
fi


дает 1 независимо от того, ввожу ли я действительный или недопустимый ip-адрес. Как я могу проверить, если конкретный адрес (или лучше любой из устройств из списка ip-адресов) перешел в автономный режим?

1218   6  

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 означает недостижимый

вам не нужны обратные кавычки в операторе 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

    Ничего не найдено.