12
votes

Comment utiliser ping dans un script

Je veux un script Bash qui fera: xxx

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


0 commentaires

9 Réponses :


18
votes

Utilisez ping code> Valeur de retour de la valeur:

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


2 commentaires

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


@Spacerocker: Très intéressant! Je viens de vérifier homme ping et je suis enclin à considérer ce comportement un bogue dans ping , car je m'attendais à une valeur de retour de 2, dans ce cas. Citation: "Si Ping ne reçoit aucun paquets de réponse, il quittera le code 1. Si un nombre de paquets et une échéance sont spécifiés, et moins que le nombre de paquets de comptage sont reçus au moment où la date limite est arrivée, elle Sortie également avec le code 1. Sur une autre erreur, il quitte le code 2. Sinon, il est possible avec code 0. Cela permet d'utiliser le code de sortie pour voir si un hôte est vivant ou non. " Quelle est votre prise ce?



0
votes

J'ai écrit ce script il y a environ 10 ans:

http://www.win.tue.nl/~rp/bin / rshall

Vous n'aurez probablement pas besoin de la partie où elle détermine chaque hôte accessible et iTerate sur chacun d'eux.


0 commentaires

10
votes

Utilisez le commutateur -w code> (ou -t code> sur FreeBSD et OS X) dans la commande ping code>, puis inspecte la valeur de retour de la commande .

   -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.


3 commentaires

La ligne retval = $? Ne fonctionne pas - je suis nouveau à Bash. Comment faites-vous le travail?


devrait être [$ retval -eq 0] .


Merci pour cette réponse. Remarque: Si vous êtes sur OSX Remplacer -w avec -t .



-1
votes

Utilisez ceci 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


0 commentaires

6
votes

Tous les environnements de réseau ne permettent pas à Ping de passer à travers (bien que de nombreux hôtes ne répondront pas à une demande de ping. Je recommanderais de ne pas utiliser Ping, mais définir plutôt le délai de connexion pour SSH:

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


1 commentaires

C'est la seule solution correcte. Il y a beaucoup d'autres raisons que Ping échouerait lorsqu'une connexion SSH réussirait.



0
votes

Utiliser 64 Valeur car l'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 fonctionnerait: P>

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 commentaires

0
votes

Voici mon hack: xxx

ne s'appuie pas sur juste ping . Pourquoi?
- Succousful ping ne vous garantit pas un accès ssh . Vous pouvez toujours ajouter un test ping également, au début de ce script et quittez si Ping échoue et ne fait rien de ce qui précède.

ci-dessus Bash Script Script, vérifie si l'appareil que vous essayez de L'accès a le port SSH ouvert pour les clients (vous) pour vous connecter. Nécessite NMAP package à installer.

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


1 commentaires

J'ajoute cette réponse dans l'espoir que les futurs utilisateurs qui atteignent cette page reçoivent une autre approche sur SSH intelligente dans leur appareil.



0
votes

Reconnaissant la question originale référencée Bash, voici un exemple pour quiconque cherche à accomplir cela dans Fish Shell:

ping -q -c 1 bogus.local; and echo "pinging the host worked"; or echo "pinging the host didn't work"


0 commentaires

0
votes
 while true;
    do
        RESULT="1"
        PING=$(ping 8.8.8.8 -c 1 | grep -E -o '[0-9]+ received' | cut -f1 -d' ')
        if [ "$RESULT" != "$PING" ]
        then
            echo "FAIL"
            exit 0
        else
            echo "connection is okay.." 
        fi
    done

0 commentaires