[Shell] Gérer un timeout d'une connexion SSH [Résolu/Fermé]

Signaler
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
-
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
-
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 :

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

6 réponses

Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 754
Salut,

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
:-))
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
108
Salut,

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...
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 754
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) :
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é.
;-))

Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
108
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
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 754
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. 
;-))
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
108
C'est super bizarre...quand je met un echo $TEMPS récupéré par le real, j'ai un timeout au bout de
70 Secondes


Tu as une idée d'où peuvent venir les 60 secondes en trop ?
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 754
Non ;-((

Tiens je te remets ce lien, peut être y trouveras-tu quelques explications... ;-))
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
108
Je l'ai lu en long en large et en travers j'ai commencé par ça ^^

Je vais chercher, je te tiens au courant ...

Au pire si demain je trouve pas je publierai tout...tout fonctionne :)
Messages postés
453
Date d'inscription
vendredi 16 février 2007
Statut
Contributeur
Dernière intervention
18 novembre 2018
108
Salut,

Bon je n'ai absolument pas trouvé d'où venait ces 60 secondes en trop...Peut être le timeout du script shell lui-même est de 60 secondes...

Bref ce n'est pas grave, le script est terminé, je m'occupe ce matin de le publier a la FAQ.

Problème résolu
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
5 décembre 2019
4 754
Ok, merci ;-))