2009-11-13 7 views
9

Je veux un script bash qui va faire:comment utiliser ping dans un script

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

Si je ne fais que ssh et l'ordinateur est iresponsive, il faut toujours le délai d'attente. Donc je pensais utiliser la sortie de ping pour voir si l'ordinateur est vivant ou non. Comment je fais ça? D'autres idées seront aussi grand

Répondre

12

Utiliser la valeur de retour de ping:

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

ping se terminera avec la valeur 0 si ce ping simple (-c 1) succceeds. Sur un ping timeout, ou si $C ne peut pas être résolu, il va quitter avec une valeur non nulle.

+1

Cette réponse est fausse, si vous n'avez pas configuré la route par défaut pour l'adresse IP de destination que vous pinguez, vous obtiendrez toujours 0 valeur retournée. –

+2

@SpaceRocker: Très intéressant! Je viens de vérifier 'man ping' et je suis enclin à considérer ce comportement comme un bug dans' ping', car je m'attendrais à une valeur de retour de 2, dans ce cas. Quote: _ "Si ping ne reçoit aucun paquet de réponse, il sortira avec le code 1. Si un nombre de paquets et une date limite sont spécifiés, et moins que le nombre de paquets est reçu au moment où la date limite est arrivée, il quittera Avec le code 1. Sur une autre erreur, il quitte avec le code 2. Sinon, il se termine avec le code 0. Cela permet d'utiliser le code de sortie pour voir si un hôte est vivant ou pas. "_ Que pensez-vous de cela? – Stephan202

8

Utilisez le commutateur -w (ou -t sous FreeBSD et OS X) sur la commande ping, puis inspectez la valeur de retour de la commande.

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

Vous pouvez régler le paramètre que vous passez avec -w si les hôtes que vous vous connectez à sont loin et le temps d'attente est plus élevé.

De 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 ligne RETVAL = $? ne fonctionne pas - je suis nouveau à bash. Comment le faites-vous fonctionner? – Guy

+0

désolé - mon erreur. Cela fonctionne – Guy

+0

devrait être '[$ RETVAL -eq 0]'. – Rhubbarb

-1

Utilisez dans votre boucle 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

Tous les environnements de réseau permettent ping de passer par (bien que beaucoup le font) et tous les hôtes répondront à un ping demande. Je recommande de ne pas utiliser la commande ping, mais au lieu de définir le délai de connexion pour ssh:

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

C'est la seule solution correcte. Il y a beaucoup d'autres raisons pour lesquelles le ping échouerait quand une connexion SSH réussirait. –

0

En utilisant 64 valeur en tant qu'outil de mesure n'est pas logique. Il est préférable d'utiliser le nombre de paquets reçus/perdus à la place.

Ce script travaillerait:

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

Voici mon astuce:

#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} 

Ne compte pas uniquement sur ping. Pourquoi ?
- Succesful ping ne vous garantit pas un accès ssh réussi. Vous pouvez également ajouter le test ping au début de ce script et quitter si ping échoue et ne rien faire de ce qui précède. Au-dessus de bash extrait de script, vérifie si le périphérique que vous essayez d'accéder à a le port SSH ouvert pour que les clients (vous) puissent s'y connecter. Nécessite le paquet nmap à installer.

Je ne comprends pas pourquoi vous voulez ssh sur plusieurs ordinateurs dans ce script. Mais, le mien travaille pour ssh en un seul appareil et peut être modifié pour répondre à vos besoins.

+0

J'ajoute cette réponse dans l'espoir que les futurs utilisateurs qui accèdent à cette page obtiennent, encore une autre approche sur SSH intelligent dans leur appareil. – smRaj