Проверка доступности хоста с помощью 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