2013-08-08 11 views
44

Voglio scrivere uno script, che continuerà a controllare se uno qualsiasi dei dispositivi in ​​rete, che dovrebbe essere online per tutto il giorno, è realmente online. Ho cercato di usare il ping, maVerificare la disponibilità dell'host utilizzando il ping negli script di bash

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

1 non importa se entro indirizzo IP valido o non valido. Come posso verificare se un indirizzo specifico (o meglio uno qualsiasi dei dispositivi dalla lista degli indirizzi IP) è andato offline?

+0

Si dovrebbe considerare l'utilizzo di 'nmap', che consente di specificare gli intervalli di indirizzi IP. – devnull

+0

FWIW, il tuo frammento funziona bene per me. –

+0

Non una risposta alla domanda, ma è meglio usare "$ (ping -c 1 some_ip_qui)" invece di "' ping -c 1 some_ip_here' ". [fai riferimento a questo link per maggiori informazioni] (http://stackoverflow.com/a/9449788/1547699) – Anubis

risposta

37

Il ping restituisce diversi codici di uscita a seconda del tipo di errore.

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 mezzi ospitano raggiungibile

2 significa irraggiungibile

+0

cool ... Sono ancora nuovo nello scripting e ho pensato che "if" nel mio codice controlla il codice di uscita. .. – burtek

+2

Sì, il tuo se attiverà il blocco 'echo 1' su qualsiasi codice di uscita diverso da 0 (tutti gli errori). Ma per capire che tipo di errore è stato, dovrai controllare il codice esatto di uscita. – StianE

+0

Ricevi '68' sul primo? Ottengo "2" e host sconosciuto. Prendo '1' sul terzo esempio con Destination Host Unreachable. – nephewtom

38

Non è necessario i backticks nel if. È possibile utilizzare questo controllo

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

Il comando if controlla il codice di uscita del seguente comando (il ping). Se il codice di uscita è zero (il che significa che il comando è terminato correttamente) verrà eseguito il blocco allora. Se restituisce un codice di uscita diverso da zero, verrà eseguito il blocco else.

15

C'è una versione avanzata di ping - "fping", che dà la possibilità di definire il timeout in millisecondi.

#!/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' ha anche un'opzione -t che ti permette di definire un timeout. –

+6

Vero. Ma in pochi secondi. 'fping' - in millisecondi, questo è importante se hai molti host da pingare. –

+0

In "unixy" ping '-t' non è per il timeout, ma per il TTL. Il timeout viene specificato tramite -W. Nota: questo può ancora bloccare per un lungo periodo, ad es. se il server DNS va via e un nome DNS deve essere risolto. Con i recenti attacchi in mente questo dovrebbe essere considerato. – dom0

3

FYI, ho solo fatto qualche test utilizzando il metodo di cui sopra e se usiamo più ping (10 richieste)

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

il risultato di comando più ping sarà "0" se almeno uno di seguito ping raggiungibile, e "1" nel caso in cui tutte le richieste di ping sono irraggiungibili.

7

mi viene in mente un uno di linea come questa per eseguire

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

Sostituire 127.0.0.1 con IP o il nome dell'host, sostituire comandi echo con quello che deve essere fatto in entrambi i casi.

Il codice sopra avrà esito positivo, forse provare con un indirizzo IP o un nome host che non è accessibile.

Ti piace questa:

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

e questo

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 
Problemi correlati