[Shell] Gérer un timeout d'une connexion SSH

Résolu/Fermé
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 - 20 mars 2008 à 10:29
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 21 mars 2008 à 09:16
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

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
20 mars 2008 à 11:01
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
:-))
0
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 120
20 mars 2008 à 11:26
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...
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
20 mars 2008 à 13:14
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é.
;-))

0
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 120
20 mars 2008 à 14:54
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
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
20 mars 2008 à 15:02
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. 
;-))
0
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 120
20 mars 2008 à 15:18
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 ?
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
20 mars 2008 à 16:06
Non ;-((

Tiens je te remets ce lien, peut être y trouveras-tu quelques explications... ;-))
0
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 120
20 mars 2008 à 16:16
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 :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lml-mike Messages postés 453 Date d'inscription vendredi 16 février 2007 Statut Contributeur Dernière intervention 18 novembre 2018 120
21 mars 2008 à 09:15
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
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
21 mars 2008 à 09:16
Ok, merci ;-))
0