Sprawdzanie dostępności hosta za pomocą skryptów ping w bash

Chcę napisać skrypt, który sprawdzałby, czy którekolwiek z urządzeń w sieci, które powinny być online przez cały dzień, jest naprawdę online. Próbowałem użyć Pinga, ale

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

Daje 1 bez względu na to, czy podam poprawny czy nieprawidłowy adres ip. Jak mogę sprawdzić, czy konkretny adres (lub lepiej dowolne urządzenie z listy adresów ip) nie działa w trybie offline?

Author: burtek, 2013-08-08

6 answers

Ping zwraca różne kody zakończenia w zależności od rodzaju błędu.

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 oznacza host osiągalny

2 oznacza nieosiągalny

 46
Author: StianE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-22 19:22:57

Nie potrzebujesz backticks w instrukcji if. Możesz użyć tego czeku

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

Polecenie if sprawdza kod wyjścia następującego polecenia (ping). Jeśli kod zakończenia wynosi zero (co oznacza, że polecenie zakończyło się pomyślnie), blok then zostanie wykonany. Jeśli zwróci niezerowy kod wyjścia, wtedy zostanie wykonany blok else.

 42
Author: user000001,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-08 10:17:37

Istnieje zaawansowana wersja ping- "fping", która daje możliwość zdefiniowania timeoutu w milisekundach.

#!/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
 17
Author: Fedir RYKHTIK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-17 15:27:55

/ Align = "left" / ]}

ping -c 1 127.0.0.1 &> /dev/null && echo success || echo fail

Zamień 127.0.0.1 na IP lub nazwę hosta, zamień polecenia echo na to, co należy zrobić w obu przypadkach.

Powyższy kod powiedzie się, może spróbuj z adresem IP lub nazwą hosta, o którym wiesz, że nie jest dostępny.

Tak:

ping -c 1 google.com &> /dev/null && echo success || echo fail

I to

ping -c 1 lolcatz.ninja &> /dev/null && echo success || echo fail
 11
Author: sdkks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-15 22:17:02

FYI, Po prostu zrobiłem jakiś test przy użyciu metody powyżej i jeśli używamy multi ping (10 requests)

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

Wynikiem polecenia multi ping będzie "0", jeśli przynajmniej jeden z wyników ping jest osiągalny, i " 1 " w przypadku, gdy wszystkie żądania ping są nieosiągalne.

 3
Author: emirjonb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-03 11:21:20
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
 2
Author: miltos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-01 05:52:13