2009-11-13 10 views
9

Voglio uno script bash che farà:come utilizzare il ping in uno script

for c in computers: 
do 
    ping $c 
    if ping is sucessfull: 
     ssh $c 'check something' 
done 

Se faccio solo ssh e il computer è iresponsive, ci vuole sempre per il timeout. Quindi stavo pensando di usare l'output di ping per vedere se il computer è vivo o no. Come lo faccio? Altre idee sarà grande anche

risposta

12

valore di ritorno Usa ping s':

for C in computers; do 
    ping -q -c 1 $C && ssh $C 'check something' 
done 

ping uscirà con il valore 0 se quel singolo ping (-c 1) succceeds. In caso di timeout del ping o se non è possibile risolvere $C, verrà chiuso con un valore diverso da zero.

+1

Questa risposta è errata, se non è stata impostata la route predefinita per l'IP di destinazione che si sta eseguendo il ping, si otterrebbe comunque 0 valore restituito. –

+2

@SpaceRocker: molto interessante! Ho appena controllato 'man ping' e sono propenso a considerare questo comportamento un bug in' ping', dato che mi aspetterei un valore di ritorno di 2, in quel caso. Citazione: _ "Se il ping non riceve alcun pacchetto di risposta, uscirà con il codice 1. Se vengono specificati un numero di pacchetti e una scadenza e meno pacchetti di conteggio vengono ricevuti al momento della scadenza, uscirà anche con il codice 1. Su altri errori esce con il codice 2. Altrimenti esce con il codice 0. In questo modo è possibile usare il codice di uscita per vedere se un host è vivo o meno. "_ Cosa ne pensi? – Stephan202

8

Utilizzare lo switch -w (o -t su FreeBSD e OS X) sul comando ping, quindi ispezionare il valore di ritorno del comando.

ping -w 1 $c 
RETVAL=$? 
if [ $RETVAL -eq 0 ]; then 
    ssh $c 'check something' 
fi 

Si consiglia di regolare il parametro si passa con -w se i padroni di casa ci si collega a sono lontani e la latenza è più alto.

Da man ping:

-w deadline 
      Specify a timeout, in seconds, before ping exits regardless of 
      how many packets have been sent or received. In this case ping 
      does not stop after count packet are sent, it waits either for 
      deadline expire or until count probes are answered or for some 
      error notification from network. 
+0

La riga RETVAL = $? non funziona - Sono nuovo in bash. Come lo fai funzionare? – Guy

+0

scusa - il mio errore. Funziona – Guy

+0

dovrebbe essere '[$ RETVAL -eq 0]'. – Rhubbarb

-1

Utilizzare questo nel vostro ciclo bash:

RESULT="64" 
PING=$(ping 127.0.0.1 -c 1 | grep 64 | awk '{print $1}') 
if [ "$RESULT" != "$PING" ] 
then 
    #ping failed 
else 
    #ping successful, do ssh here 
fi 
4

Non tutti gli ambienti di rete Permettere il ping di passare attraverso (anche se molti lo fanno) e non tutti gli host risponderà un ping richiesta. Suggerirei di non usare ping, ma invece impostare il timeout di connessione per ssh:

 
for c in compuers; do 
    ssh -o ConnectTimeout=2 $c 'check something' 
done 
+0

Questa è l'unica soluzione corretta. Ci sono molti altri motivi per cui il ping fallirebbe quando una connessione SSH avrebbe avuto successo. –

0

Utilizzando 64 valore come strumento di misurazione non è logico. È preferibile utilizzare il numero di pacchetti ricevuti/persi.

Questo script dovrebbe funzionare:

RESULT="1" 
PING=$(ping ADDRESS -c 1 | grep -E -o '[0-9]+ received' | cut -f1 -d' ') 
if [ "$RESULT" != "$PING" ] 
then 
    DO SOMETHING 
else 
    DO SOMETHING 
fi 
0

Ecco il mio trucco:

#ipaddress shell variable can be provided as an argument to the script. 
while true 
do 
    nmap_output=$(nmap -p22 ${ipaddress}) 
    $(echo ${nmap_output} | grep -q open) 
    grep_output=$? 
    if [ "$grep_output" == 0 ] ; then 
     #Device is LIVE and has SSH port open for clients to connect 
     break 
    else 
     #[01 : bold 
     #31m : red color 
     #0m : undo text formatting 
     echo -en "Device is \e[01;31mdead\e[0m right now .... !\r" 
    fi 
done 
#\033[K : clear the text for the new line 
#32 : green color 
echo -e "\033[KDevice is \e[01;32mlive\e[0m !" 
ssh [email protected]${ipaddress} 

non si basa solo su ping. Perché ?
- Il successo ping non garantisce un accesso corretto a ssh. Puoi anche aggiungere il test ping all'inizio di questo script e uscire se il ping fallisce e non fare nulla da quanto sopra.

Sopra lo bash snippet di script, verifica se il dispositivo a cui si sta tentando di accedere a ha la porta SSH aperta per i client (i) a cui connettersi. Richiede il pacchetto nmap da installare.

Non capisco perché si desidera ssh in più computer in quello script. Ma, il mio funziona per ssh in un unico dispositivo e può essere modificato in base alle proprie esigenze.

+0

Sto aggiungendo questa risposta nella speranza che i futuri utenti che raggiungono questa pagina ottengano, ancora un altro approccio su SSH intelligente nel loro dispositivo. – smRaj