2013-08-08 13 views
44

Chcę napisać skrypt, który sprawdzałby, czy którekolwiek z urządzeń w sieci, które powinny być online przez cały dzień, są naprawdę online. Próbowałem użyć polecenia ping, aleSprawdzanie dostępności hosta za pomocą polecenia ping w skryptach bash

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

daje 1 bez względu na to, czy mogę podać poprawny lub niepoprawny adres IP. Jak mogę sprawdzić, czy określony adres (lub lepiej jakiekolwiek urządzenie z listy adresów IP) przeszedł w tryb offline?

+0

Należy rozważyć użycie 'nmap', pozwala określić zakresy adresów IP. – devnull

+0

FWIW, twój fragment działa dobrze dla mnie. –

+0

Nie jest to odpowiedź na pytanie, ale lepiej użyć "$ (ping -c 1 some_ip_here)" zamiast "ping -c 1 some_ip_here". [sprawdź ten link, aby uzyskać więcej informacji] (http://stackoverflow.com/a/9449788/1547699) – Anubis

Odpowiedz

37

Ping zwraca różne kody wyjścia 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 środki gospodarzem osiągalny

2 oznacza nieosiągalny

+0

fajne ... Nadal nie używam skryptów i pomyślałem, że 'if' w moim kodzie sprawdza kod zakończenia. .. – burtek

+2

To robi, twój, jeśli wywoła blok 'echo 1' na każdym kodzie wyjścia poza 0 (wszystkie błędy). Ale żeby dowiedzieć się, jaki błąd popełniłeś, sprawdź dokładny kod wyjścia. – StianE

+0

Czy otrzymujesz '68' na pierwszym? Dostaję "2" i nieznany host. Dostaję "1" na trzecim przykładzie z Destination Host Unreachable. – nephewtom

38

Nie trzeba się odwrócone, pojedyncze apostrofy w if. Możesz użyć tej kontroli, jeśli polecenie sprawdza kod wyjściowy następującego polecenia (ping). Jeśli kod wyjścia jest równy zero (co oznacza, że ​​polecenie zakończyło się pomyślnie), wówczas zostanie wykonany następny blok. Jeśli zwróci niezerowy kod wyjścia, zostanie wykonany blok else.

15

Istnieje zaawansowana wersja polecenia ping - "fping", która umożliwia zdefiniowanie limitu czasu 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 
+0

'ping' również ma opcję -t, która pozwala ci zdefiniować timeout. –

+6

Prawda. Ale w ciągu kilku sekund. 'fping' - w milisekundach, to ważne, jeśli masz dużo hostów do pingowania. –

+0

W "unixie" ping '-t' nie jest dla timeout, ale dla TTL. Limit czasu jest określony przez -W. Uwaga: może to nadal blokować przez długi czas, np. jeśli serwer DNS zniknie, a nazwa DNS musi zostać rozwiązana. Biorąc pod uwagę niedawne ataki, należy to uwzględnić. – dom0

3

FYI, Właśnie zrobiłem kilka testów przy użyciu metody powyżej jeśli używamy wielu ping (10 wnioski)

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

wynik polecenia ping wielu będzie „0”, jeżeli przynajmniej jeden z wyniku ping osiągalny, i „1” w przypadku, gdy wszystkie żądania ping jest nieosiągalny.

7

mogę myśleć o jednej liniowej jak to uruchomić

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

Wymień 127.0.0.1 z IP lub nazwę hosta, należy wymienić polecenia echo tego, co należy zrobić w każdym przypadku.

Powyższy kod się powiedzie, może spróbuj użyć adresu IP lub nazwy hosta, która jest niedostępna.

Jak to:

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

i to

ping -c 1 lolcatz.ninja &> /dev/null && echo success || echo fail 
1
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 
Powiązane problemy