Je veux un script Bash qui fera: si je ne fais que ssh code> et que l'ordinateur est irresponsable, il faut pour toujours pour le délai d'attente. Je pensais donc utiliser la sortie de
ping code> pour voir si l'ordinateur est vivant ou non. Comment je fais ça? D'autres idées seront super également p> p>
9 Réponses :
Utilisez ping code>
Valeur de retour de la valeur:
for C in computers; do ping -q -c 1 $C && ssh $C 'check something' done
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 code> et je suis enclin à considérer ce comportement un bogue dans
ping code>, 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. " I> Quelle est votre prise ce?
J'ai écrit ce script il y a environ 10 ans: P>
http://www.win.tue.nl/~rp/bin / rshall p>
Vous n'aurez probablement pas besoin de la partie où elle détermine chaque hôte accessible et iTerate sur chacun d'eux. P>
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.
La ligne retval = $? Ne fonctionne pas - je suis nouveau à Bash. Comment faites-vous le travail?
devrait être [$ retval -eq 0] code>.
Merci pour cette réponse. Remarque: i> Si vous êtes sur OSX Remplacer -w code> avec
-t code>.
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
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
C'est la seule solution correcte. Il y a beaucoup d'autres raisons que Ping échouerait lorsqu'une connexion SSH réussirait.
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
Voici mon hack: ne s'appuie pas sur juste ci-dessus Je ne comprends pas pourquoi vous voulez ping code>. Pourquoi?
- Succousful ping code> ne vous garantit pas un accès
ssh code>. Vous pouvez toujours ajouter un test
ping code> également, au début de ce script et quittez si Ping échoue et ne fait rien de ce qui précède. p>
Bash code> 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 code> package à installer. P>
ssh code> 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. p> p>
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.
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"
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