[Shell] Gérer un timeout d'une connexion SSH
Résolu
lml-mike
Messages postés
455
Date d'inscription
Statut
Contributeur
Dernière intervention
-
jipicy Messages postés 40842 Date d'inscription Statut Modérateur Dernière intervention -
jipicy Messages postés 40842 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
Je suis actuellement sur un script shell pour saisir automatiquement des commandes sur des équipements distants.
Tout est terminé, prêt à etre publié sur la FAQ de commentcamarche, mais il reste cependant un détail qui est assez crucial, en ce qui concerne la gestion d'erreur, qui est le timeout.
Pour palier ce problème, j'ai pensé a lancer le fichier généré dans le script avec la commande "time -p", de récupérer la valeur après "real", et de forcer le script de continuer après que la valeur après ce "real" ai atteinds 15 (secondes).
Cela donne :
J'ai cependant une chose assez bizarre...le time s'affiche dans la sortie standard (affichée à l'écran quoi...), mais aucunement ne rentre dans le fichier temp.log, donc forcement il me renvoie une erreur comme quoi il n'est pas arrivé à faire le grep...
Ai-je oublié un détail important ?
Merci pour votre aide !
Michael
Je suis actuellement sur un script shell pour saisir automatiquement des commandes sur des équipements distants.
Tout est terminé, prêt à etre publié sur la FAQ de commentcamarche, mais il reste cependant un détail qui est assez crucial, en ce qui concerne la gestion d'erreur, qui est le timeout.
Pour palier ce problème, j'ai pensé a lancer le fichier généré dans le script avec la commande "time -p", de récupérer la valeur après "real", et de forcer le script de continuer après que la valeur après ce "real" ai atteinds 15 (secondes).
Cela donne :
time -p ssh.sh 2>&1 > temp.log TEMPS=`grep 'real ' temp.log | sed 's/real /§/' | cut -d'§' -f2 | cut -d' ' -f1 | cut -d'.' -f1` if [ $TEMPS -gt 15 ] then echo "Le routeur $routeur ne réponds pas !"; echo "$routeur : connection timed out" >> erreurs.txt continue fi
J'ai cependant une chose assez bizarre...le time s'affiche dans la sortie standard (affichée à l'écran quoi...), mais aucunement ne rentre dans le fichier temp.log, donc forcement il me renvoie une erreur comme quoi il n'est pas arrivé à faire le grep...
Ai-je oublié un détail important ?
Merci pour votre aide !
Michael
A voir également:
- Timeout informatique
- Le code ascii en informatique - Guide
- Jargon informatique - Télécharger - Bureautique
- Romaco timeout - Télécharger - Contrôle parental
- Que veut dire url en informatique - Guide
- Souris informatique - Guide
6 réponses
Salut,
Et comme ça, c'est pas mieux :
;-))
Édit : Pour récupérer le temps :
Et comme ça, c'est pas mieux :
time -p ssh.sh > temp.log 2>&1???
;-))
Édit : Pour récupérer le temps :
sed -n '/^real/ s/.* \(.*\)\..*/\1/p' temp.log:-))
Et gérer ça depuis l'appel dans le script ce ne serait pas mieux ?
ssh ou telnet génère un code d'erreur (255 et 1 respectivement) en cas d'échec, pourquoi ne pas se servir de ce code retour ? Même à la limite avec la commande "time" (extrait) :
ssh ou telnet génère un code d'erreur (255 et 1 respectivement) en cas d'échec, pourquoi ne pas se servir de ce code retour ? Même à la limite avec la commande "time" (extrait) :
CODE RENVOYÉ Si la commande a été invoquée, le code de sortie est celui de la com- mande. Sinon, il s'agit de 127 si la commande n'a pas été trouvée, 126 si elle a été trouvée mais n'a pas pu être invoquée, et une autre valeur non-nulle (1-125) si quelque chose d'autre a échoué.;-))
Je le gère déjà le code erreur :)
Le problème c'est que certains problème, comme une mauvaise résolution de nom DNS (un nom pas associé a une IP), des identifiants/mots de passe incorrects, où encore ce fichu timeout, ne renvoie pas de code erreur !
Avec les autres, j'ai pu me servir du message d'erreur à la tentative de connexion pour identifier, annoncer et isoler l'erreur, mais pour un timeout...ben ça bouge pas ^^
Au final, je me sers du timeout expect de 30 secondes, ma question est : est-il possible de le réduire de 10 secondes ? :)
Merci encore Jipicy
P.S.: petite question bonus tant que j'y suis...pour tester si un fichier existe il y a la fonction:
if [ -f $fichier ]
Mais si je veux tester le fait que le fichier n'existe pas, quel doit etre la syntaxe...(question de propreté)...j'aimerai ne pas avoir a mettre ca :
if [ -f $fichier ]
then
continue
else
blablabla...
fi
Les "continue", c'est le mal, c'est pas optimisé et pour le débuggage bonjour ! :P
Le problème c'est que certains problème, comme une mauvaise résolution de nom DNS (un nom pas associé a une IP), des identifiants/mots de passe incorrects, où encore ce fichu timeout, ne renvoie pas de code erreur !
Avec les autres, j'ai pu me servir du message d'erreur à la tentative de connexion pour identifier, annoncer et isoler l'erreur, mais pour un timeout...ben ça bouge pas ^^
Au final, je me sers du timeout expect de 30 secondes, ma question est : est-il possible de le réduire de 10 secondes ? :)
Merci encore Jipicy
P.S.: petite question bonus tant que j'y suis...pour tester si un fichier existe il y a la fonction:
if [ -f $fichier ]
Mais si je veux tester le fait que le fichier n'existe pas, quel doit etre la syntaxe...(question de propreté)...j'aimerai ne pas avoir a mettre ca :
if [ -f $fichier ]
then
continue
else
blablabla...
fi
Les "continue", c'est le mal, c'est pas optimisé et pour le débuggage bonjour ! :P
Extrait de timeout :
The default timeout period for expect is 10 seconds but may be set, for example to 30, by the command “set timeout 30”. Timeout is an expect global.;-))
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Oui, c'etait la bonne syntaxe en effet, cependant cela ne permet pas de gérer le timeout d'un routeur qui ne réponds pas, comme je l'esperais...
Le script bloque, et dès lors que je l'arrete avec Ctrl+C, LA le real s'affiche dans le fichier temp et est traité...
Tu as une autre solution ? Parce que là...je bloque...