Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

[expect] Boucler autant de fois qu'une valeur récupérée


Sujet :

Shell et commandes GNU

  1. #21
    Membre régulier
    ah oui, en effet.

    Cependant, sur cisco, les ingénieurs qui ont dev le CLI ont permis l'exe de script quand tu es dessus, c'est pour ça, et tu dois taper "tclsh" (de mémoire) quand t'es sur du cisco, ce qui n'est pas le cas du HP.

    Bon maintenant, faut que je comprenne la boucle à la con que tu m'as montré pour arriver au résultat que je souhaite

  2. #22
    Membre régulier
    ok, donc je suis complétement con c'est officiel

    j'ai mis "send" à la place de puts et niquel, ça s'affiche trop vite pour le coup

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    for {set i 2} {$i<[llength $expect_out(0,string)]} {incr i;incr i} { send "dir slot[lindex $expect_out(0,string) $i]#flash:/ \n" }



    donc comment je rajoute un sleep là dedans ? car je pense que je peux pas rajouter autant de paramètres comme je veux là dedans

    il faudrait que j'arrive à : afficher que les slot à partir du n° 2 et savoir comment je peux rajouter des commandes dans la même boucle

  3. #23
    Expert éminent sénior
    Si, dans le bloc du corps de la boucle for, tu peux mettre autant de commandes que tu veux, mais je ne pense pas que le sleep soit la meilleure solution.

    En restant général:

    -Quand tu fais du expect, tu fais du tcl qui tourne autour de 3 commandes:

    1) spawn: qui permet d'initier le process avec lequel tu vas interagir (dans ton cas, c'est ssh ....)
    2) send: elle permet d'envoyer des données au process initié précédemment (elle t'émule en train de taper au clavier)
    3) expect: elle permet de récupérer ce que le process te renvoie en retour sur l'écran (via des regex,elle t'émule en train de chercher une certaine zone de texte sur l'écran)

    Donc, dans un premier temps, oublions un peu expect, et depuis un terminal de ton linux (celui où tu lances ton script expect),
    passe tes commandes ssh,dis| inc,... et pour chacune, essaye de déterminer la regex la plus simple possible qui te permettra de récupérer la zone texte qui t'intéresse pour pouvoir passer à la commande suivante.
    C'est une fois que tu auras ça, que tu pourras passer à l'étape expect.

    PS: Sinon, tu peux éventuellement voir du coté de l'outils autoexpect qui va créer interactivement un script expect pour toi, mais faudra que tu le retouches pour le rendre plus général.
    Cordialement.

  4. #24
    Membre régulier
    comment je rajoute des commandes dans la boucle for, dans le même corps { send "xxx" } ou en rajoutant des blocs les uns derrières les autres ?

  5. #25
    Expert confirmé
    Citation Envoyé par tetzispa Voir le message
    comment je rajoute des commandes dans la boucle for, dans le même corps { send "xxx" } ou en rajoutant des blocs les uns derrières les autres ?
    Sans rien comprendre au problème, a priori, d'après la réponse de disedorgue, je dirais bien:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for {set i 2} {$i<[llength $expect_out(0,string)]} {incr i;incr i} {
       send "dir slot[lindex $expect_out(0,string) $i]#flash:/ \n"
      sleep 1
    }


    J'ai tout faux?

  6. #26
    Membre régulier
    malheureusement oui, t'as tout faux pour le coup haha !

    le sleep 1 se met après les { } dedans la boucle ne comprend pas

    mais ma question portait sur le fait de rajouter un autre envoi de commande au switch comme le "send"

  7. #27
    Expert éminent sénior
    Bonjour

    Pour bien commencer la journée, c'est important de mettre un sleep. Surtout avant une accolade.

    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  8. #28
    Expert éminent sénior
    Citation Envoyé par jack-ft Voir le message
    Sans rien comprendre au problème, a priori, d'après la réponse de disedorgue, je dirais bien:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for {set i 2} {$i<[llength $expect_out(0,string)]} {incr i;incr i} {
       send "dir slot[lindex $expect_out(0,string) $i]#flash:/ \n"
      sleep 1
    }


    J'ai tout faux?
    Non, c'est bien ça, après expect est capricieux sur la synchro coté flux de données, et donc ça peut ne pas fonctionner correctement, mais ça n'a rien voir avec l’interprétation du code.

    Et les sleep n'arrange pas les choses...

    Il vaut mieux préférer les regex et peut-être aussi faire des send avec l'option -h en ayant au préalable défini la variable send_human en début de script, comme ça expect fera le send à une vitesse disons humaine (exemple de définition pris dans le man de expect: set send_human {.1 .3 1 .05 2} ).
    Cordialement.

  9. #29
    Membre régulier
    ceci dit, l'affichage m'importe peu (la vitesse je parle) car c'est un test pour voir que ça boucle bien sur les différents slots

    j'en reviens à ma question d'origine :

    je rajoute un bloc de commande à quel niveau ? et faire en sorte que ma commande ne boucle qu'au 2ème slot !

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for {set i 2} {$i<[llength $expect_out(0,string)]} {incr i;incr i} {
       send "dir slot[lindex $expect_out(0,string) $i]#flash:/ \n" { autre bloc de commande } { etc }
      sleep 1
    }

###raw>template_hook.ano_emploi###