J'utilise un script expect qui se déroule bien, sauf qu'il sort avant la fin. Et je ne comprend pas pourquoi.
Ce script sert à récupérer des info sur un équipement réseau. Ces informations sont listées "page par page" comme si on visualisait un texte avec la commande "more". Ici il y a 5 pages, pour passer d'une page à l'autre j'utilise une autre commande qui dépend de la version de cet équipement.
Suite à ce listage, je dois lancer d'autres commandes ("autre_commande_x"), mais celles-ci ne sont jamais exécutées, le script sort avant la fin de l'exécution.
set VERSION 10
expect "$PROMPT"
send "commande_listage\r"
for {set i 1} {$i<=5} {incr i 1} {
expect "more"
switch $VERSION {
10 {send "commande_10\r"}
09 {send "commande_09\r"}
}
}
expect "$PROMPT"
send "autre_commande_1"
expect "$PROMPT"
send "autre_commande_2"
exit
Le script n'est pas en entier, mais le reste fonctionne et de plus je suis pas sûr de pouvoir en mettre plus sans me faire tirer les oreilles par mes chefs.
Bye
# Précisions
Posté par Kerro . Évalué à 2.
D'autant plus que ça te donnerais la solution directement.
[^] # Re: Précisions
Posté par mekare . Évalué à 1.
Le script sort à la fin de la boucle for, avant le send "autre_commande_1" (ou avant le expect "$PROMPT")
[^] # Re: Précisions
Posté par Kerro . Évalué à 2.
Sûr ?
Si tu mets seulement 4 itérations tu devrais alors tomber sur un blocage (car $PROMPT ne sera pas présent). C'est bien ça ?
[^] # Re: Précisions
Posté par mekare . Évalué à 1.
La syntaxe de ma boucle for me parait pourtant correcte.
Précision, j'utilise Expect 5.32.2-4 et TCL 8.3.3-7 sur une Debian Woody.
[^] # Re: Précisions
Posté par Kerro . Évalué à 2.
Ca me semble tout à fait élémentaire. Il y a je crois quelque chose de basique qui t'échappe :-)
[^] # Re: Précisions
Posté par mekare . Évalué à 1.
Je comprend la difficulté, surtout que politique de confidentialité merdique oblige, je ne peux pas tout expliquer en clair, du coup je transforme pas mal de trucs et ça devient limite compréhensible. Désolé.
si il y a un timeout, c'est qu'il n'y a pas de "more" ou de "$PROMPT"
Il y a un timeout si je réduis le nombre de boucle for uniquement (comme tu me l'as suggéré pour tester), sinon je suis bon, en sortie de boucle j'arrive bien à mon $prompt mais le script sort à ce moment là.
[^] # Re: Précisions
Posté par mekare . Évalué à 1.
Bon, j'ai fait quelques test plus concrets et pas confidentiel cette fois : sur un boitier JetDirect.
Je pense que j'ai identifié un des problèmes : mon prompt ou mon more sont détectés ailleurs que là ou ils devraient se trouver, du coup les commandes après la boucle for sont exécutées mais pas au bon endroit (enfin, je pense il faudra que je vérifie ça au taf demain).
Bon, ça c'est donc une piste à suivre pour moi.
Pour palier à ça, je me suis dit "facile" je défini mon prompt autrement. Celui-ci démarre en début de ligne, c'est donc facile. Exemple avec le script de test sur mon JetDirect :
#!/usr/bin/expect -f
set PROMPT "^>"
set VERSION 10
set timeout 10
log_file -a log.txt
spawn telnet 192.168.1.4
expect -re "$PROMPT"
send "\?\r"
for {set i 1} {$i<=5} {incr i 1} {
expect -re "$PROMPT"
switch $VERSION {
10 {send "\?\r"}
09 {send "/\r"}
}
}
expect -re "$PROMPT"
send "/\r"
expect -re "$PROMPT"
send "exit\r"
exit
Et là, grosse blague, le prompt n'est pas détecté, j'ai droit au timeout à chaque commande (le script s'exécute mais sans détecter le prompt).
Pourquoi ne le détecte-t-il pas ?
Comme j'ai fait un fichier de log, j'ai pu constater qu'à chaque fin de ligne j'ai des "^M". En sont-ils la cause ? Si oui, comment les supprimer ?
[^] # Re: Précisions
Posté par Kerro . Évalué à 2.
Au cas où, supprime le signe $ pour les tests.
[^] # Re: Précisions
Posté par mekare . Évalué à 1.
[^] # Re: Précisions
Posté par mekare . Évalué à 1.
Lors de mon spawn et après l'envoie du login et du password, le premier prompt est différent des prompts suivants, de fait j'avais un décalage dans l'envoi de mes commande et dans la reconnaissance des "expect". En plus de ça j'ai des équipements en versions différentes et le prompt change d'une version à l'autre (sinon ce serait trop simple). J'avais également dans ce que j'interroge du texte qui était en partie comme le prompt.
Pour palier à ça je déclare tous mes prompts dans une variable sous forme d'expression régulière et je les détectes grace à un expect -re.
Exemple :
set PROMPT "toto|titi|tata"
expect -re "$PROMPT"
send "machin_truc\r
J'avoue que vu ce que j'ai donné (mais je ne pouvais pas en donner plus) il était impossible de trouver.
Merci encore pour ton aide.
[^] # Re: Précisions
Posté par Kerro . Évalué à 2.
j'ai finalement trouvé et le défaut ne provient pas d'expect mais de moi
Et dans ces cas là on se dit "rahhlala le temps que j'ai perdu avec cette bêtise" :-)
Si c'était facile, ça se saurait. Après coup ça semble tout bête, mais ça ne l'est pas. D'où des brouettes d'erreurs, d'étourderies, et compagnie.
# trop sympa le mec
Posté par jluce . Évalué à -1.
trop fort, ça c'est de la pédagogie...
a+
je plussoie et je paie ma tournée !!!!
[^] # Re: trop sympa le mec
Posté par Kerro . Évalué à 3.
[^] # Re: trop sympa le mec
Posté par mekare . Évalué à 1.
[^] # Re: trop sympa le mec
Posté par jluce . Évalué à 1.
ce qui fait que ce genre de réfection m'agace: le genre RTFM.....
désolé si vous l'avez mal pris;-))
a+
je plussoie et je paie ma tournée !!!!
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.