Подтвердить что ты не робот

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

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

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

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

4b9b3361

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

Ответ 2

Вам не нужны обратные ссылки в инструкции if. Вы можете использовать эту проверку

if ping -c 1 some_ip_here &> /dev/null
then
  echo 1
else
  echo 0
fi

Команда if проверяет код выхода следующей команды (пинг). Если код выхода равен нулю (что означает, что команда завершена успешно), тогда будет выполнен блок. Если он вернет ненулевой код выхода, будет выполнен блок else.

Ответ 3

Существует расширенная версия 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

Ответ 4

Я могу подумать о том, что один лайнер для этого запускал

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

Ответ 5

FYI, Я просто сделал несколько тестов, используя вышеописанный метод, и если мы используем multi ping (10 запросов)

ping -c10 8.8.8.8 & > /dev/null; echo $?

результат команды multi ping будет "0", если хотя бы один из результатов ping достигнут, и "1", если все запросы ping недоступны.

Ответ 6

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