Forum Programmation.autre Expect : sortie du script non désirée

Posté par  .
Étiquettes : aucune
-1
4
mai
2009
Bonjour,

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  . Évalué à 2.

    Si tu nous disais à quel endroit ton script sort, ce serait bien :-)
    D'autant plus que ça te donnerais la solution directement.
    • [^] # Re: Précisions

      Posté par  . Évalué à 1.

      C'est vrai que ce n'était pas forcément clair.
      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  . Évalué à 2.

        Le script sort donc une fois qu'il a envoyé 5 fois "commande_xx" ?
        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  . Évalué à 1.

          Il y a effectivement un blocage jusqu'au timeout de 30 secondes (set timeout 30) puis le script sort et n'exécute pas le reste...

          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  . Évalué à 2.

            Je ne saisi pas. Tu as tous les éléments en main pour comprendre. Il ne te reste plus qu'à utiliser ton cerveau pour piger que si il y a un timeout, c'est qu'il n'y a pas de "more" ou de "$PROMPT".
            Ca me semble tout à fait élémentaire. Il y a je crois quelque chose de basique qui t'échappe :-)
            • [^] # Re: Précisions

              Posté par  . Évalué à 1.

              Je ne saisi pas
              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  . Évalué à 1.

                Re,

                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  . Évalué à 2.

                  A mon avis, tu devrais commencer supprimer ton "-re" qui ne sert pas... et qui transforme ton "$PROMPT" en expression régulière, donc tu recherches une fin de ligne suivie de PROMPT, par terrible :-)
                  Au cas où, supprime le signe $ pour les tests.
                  • [^] # Re: Précisions

                    Posté par  . Évalué à 1.

                    $PROMPT est censé être une variable contenant une expression régulière... mas syntaxe est incorrecte ?
                    • [^] # Re: Précisions

                      Posté par  . Évalué à 1.

                      Je m'auto-répond car j'ai finalement trouvé et le défaut ne provient pas d'expect mais de moi :

                      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  . Évalué à 2.

                        Heu... content de ne pas t'avoir aidé :-)

                        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  . Évalué à -1.

    en claire pour poser des question sur des script il faut tout savoir sur les scripts

    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  . Évalué à 3.

      La critique est facile, mais tu as "oublié" de donner ton aide.
      • [^] # Re: trop sympa le mec

        Posté par  . Évalué à 1.

        Je te "plussois", merci pour ton aide Kerro.
      • [^] # Re: trop sympa le mec

        Posté par  . Évalué à 1.

        probablement un manque de compétences dans ce domaine.....

        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.