IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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. #1
    Membre régulier
    Inscrit en
    Janvier 2011
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 179
    Points : 107
    Points
    107
    Par défaut [expect] Boucler autant de fois qu'une valeur récupérée
    Hello !

    j'ai un script (non optimisé ) en expect afin de me connecter et pousser des firmwares sur des équipements réseau. Généralement, ça peut demander une interaction "humaine" afin de valider la commande, d'où la nécessité d'utiliser "expect".

    Mon script fonctionne mais je me suis rendu compte que des équipements sont stackés et donc je pousse mon image sur le 1er équipement du stack mais pas sur les N autres vu que je ne teste pas avant de savoir combien j'ai d'équipements.

    Question donc :

    comment faire un test pour récupérer le nombre d'équipement que j'ai dans un slot afin de pouvoir récupérer cette valeur et après faire une boucle en fonction de la valeur X ?

    mon script (pas du tout optimisé je pense, et je crois qu'il me pète une erreur à la fin mais ça fonctionne quand même, donc je suis preneur des modifications possibles) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    #!/usr/bin/expect
    #expect.sh
    set username USER
    set password PASSWORD
    set image IMAGE
     
    set ip_file "switches.txt"
    set fid [open $ip_file r]
     
    while {[gets $fid ip] != -1} {
     
     
     
    spawn ssh $username@$ip
    expect "password"
    send "$password\n"
     
    sleep 1
     
    send "sys \n"
     
    sleep 1
     
    send "dns server XXX.XXX.XXX \n"
     
    sleep 1
     
    send "dns server XXX.XXX.XXX \n"
     
    sleep 1
     
    send "dns resolve \n"
     
    sleep 1
     
    send "quit \n"
     
    sleep 1
     
    send "delete /unreserved *.bin \n"
     
    sleep 1
     
    expect "Continue"
    send "y\n"
     
    sleep 1
     
    send "tftp XXX.XXX.XXX get $image \n"
     
    sleep 1
     
    send "boot-loader file $image slot all main \n"
     
    sleep 1
     
    expect "Continue"
    send "y\n"
     
    sleep 1
     
    send "save force \n"
     
    sleep 1
     
    send "quit \n"
     
    interact
     
    }
     
    close $fid
    ma commande que je tape pour voir le nombre de slot sur le stack :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dis device | inc Slot
     Slot 1
     Slot 2
     Slot 3
     Slot 4
     Slot 5
    donc comment en faire une condition pour pouvoir faire une boucle ?

    merci pour vos retours avisés !

  2. #2
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Bonjour.

    Pas sur d'avoir tout compris et étant pas très callé avec expect, je me lance quand même comme vous n'avez pas eu de réponse.
    Voici une piste qui pourrait peut être vous aider : récupérer à l'interieur de votre script le nombre d'occurrence de "Slot [0-9]+" dans la sortie de votre commande en exécutant une commande shell.

    Par exemple avec grep :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ineumann ~ $ cat test.txt 
     Slot 1
     Slot 2
     Slot 3
     Slot 4
     Slot 5
    ineumann ~ $ cat test.txt|grep -Ei "Slot [0-9]+"
     Slot 1
     Slot 2
     Slot 3
     Slot 4
     Slot 5
    ineumann ~ $ cat test.txt|grep -Eic "Slot [0-9]+"
    5
    En supposant que vous ayez grep dans votre interpréteur de commande sur lequel vous exécutez votre commande magique dis device | inc Slot (après vous pouvez peut être rapatrier la sortie de cette commande sur un interpréteur bash ou autre).

    En exécutant cette commande dans votre script vous avez plus qu'à faire une boucle type "for" avec incrément.

    Idriss

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2011
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 179
    Points : 107
    Points
    107
    Par défaut
    Hello,

    merci pour ce premier retour.

    Le problème d'utiliser grep, c'est que je dois être côté serveur linux, en face, le switch, il comprend certaines commandes.

    Dans ce que tu me mets, il faudrait que je fasse une première passe sur mes switchs, que j'exporte la sortie des commandes pour chaque switch (un fichier = un switch) et qu'après je fasse un grep dedans pour savoir le nombre de slot et après de récupérer ça pour refaire une passe pour lancer ce qu'il faut (je le comprends comme ça).


    est-ce que je n'aurais pas un début de réponse avec ça :

    https://www.thegeekstuff.com/2011/01...ps-conditions/

  4. #4
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Bonjour,

    Voici un exemple, à toi d'adapter à ton besoin:
    Je n'ai pas ta commande, donc j'ai mis le résultat dans un fichier que je vais lire, donc le fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ cat dis_inc 
     Slot 1
     Slot 2
     Slot 3
     Slot 4
     Slot 5
    A partir d'ici, je suis dans expect:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    expect1.1> set rescmd [exec cat dis_inc]
     Slot 1
     Slot 2
     Slot 3
     Slot 4
     Slot 5
    expect1.2> for {set i 1} {$i<[llength $rescmd]} {incr i;incr i} { send "echo [lindex $rescmd $i]\n" }
    echo 1
    echo 2
    echo 3
    echo 4
    echo 5
    expect1.3>
    La première commande execute la commande cat dis_inc et stock l'output de la commande dans la variable rescmd.
    La deuxième commande, parcourt la variable rescmd en ne lisant qu'un mot sur 2 à partir du mot 1 (le mot 0 est le premier "Slot", donc le mot 1 sera "1", le 3 sera "2",...)
    Si à la place de send tu fais set x [lindex $rescmd $i], la variable x contiendra la valeur du mot en position $i.
    Cordialement.

  5. #5
    Membre régulier
    Inscrit en
    Janvier 2011
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 179
    Points : 107
    Points
    107
    Par défaut
    Hello !

    merci pour vos retours, mais y'a des choses intéressantes (sur la logique) mais ça ne répond pas forcément à ce que je cherche.

    je comprends un peu le truc de faire un cat sur un fichier, mais la commande est lancée directement dans l'expect et c'est une commande compréhensible que par le switch

    en gros j'arrive en mode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    sleep 1
     
    send "dis device | inc Slot"
    et là c'est aussi le switch qui répond :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <sw-ce-pr-2eme-a2.2-55>dis device | inc Slot
     Slot 1
     Slot 2
     Slot 3
     Slot 4
     Slot 5
    donc il faudrait que expect comprenne qu'il y a 5 lignes pour pouvoir boucler dedans après

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Faut faire des efforts, voici un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ cat ttt.exp
    spawn bash
    send "cat /tmp/dis_inc\n"
    expect -indices -re "(Slot.*\[0-9]*)"
    for {set i 1} {$i<[llength $expect_out(0,string)]} {incr i;incr i} { puts "je suis sur le SLOT n° [lindex $expect_out(0,string) $i]" }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ cat /tmp/dis_inc
     Slot 1
     Slot 2
     Slot 3
     Slot 4
     Slot 5
    Et le résultat de l'execution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    spawn bash
    cat /tmp/dis_inc
    $ cat /tmp/dis_inc
     Slot 1
     Slot 2
     Slot 3
     Slot 4
     Slot 5
    je suis sur le SLOT n° 1
    je suis sur le SLOT n° 2
    je suis sur le SLOT n° 3
    je suis sur le SLOT n° 4
    je suis sur le SLOT n° 5
    Cordialement.

  7. #7
    Membre régulier
    Inscrit en
    Janvier 2011
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 179
    Points : 107
    Points
    107
    Par défaut
    c'est pas un problème d'effort

    j'essaie de comprendre pourquoi tu fais des commandes côté unix.

    le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    send "cat /tmp/dis_inc\n"
    n'est pas compréhensible côté switch, vu que expect c'est pour lancer des commandes ce sur quoi on est connectés. D'où mon incompréhension.

    ou alors, il faut que je remplace ta commande par ce que je veux faire !

    voilà ce qui se passe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #!/usr/bin/expect
    #expect.sh
    set username USER
    set password PASSWORD
    set image IMAGE
     
     
    set ip_file "switches.txt"
    set fid [open $ip_file r]
     
    while {[gets $fid ip] != -1} {
     
     
     
    spawn ssh $username@$ip
    expect "password"
    send "$password\n"
     
    sleep 1
     
    send "dis device | inc Slot \n"
     
    sleep 1 
     
    expect -indices -re "(Slot.*\[0-9]*)"
    for {set i 1} {$i<[llength $expect_out(0,string)]} {incr i;incr i} { puts "je suis sur le SLOT n° [lindex $expect_out(0,string) $i]" }
     
    send "quit \n"
     
     
    interact
     
    }
     
    close $fid

    et voilà le résultat :

    [rancid ~]$ ./slot.sh
    spawn ssh rancid@XXX.XXX.XXX.XXX


    ***************************************************************************************************
    * *
    * !! AVERTISSEMENT !! *
    * Vous etes connectes sur un systeme dont les acces sont restreints aux personnes habilitees. *
    * Le maintien frauduleux de cette connexion sans autorisation, l entrave du fonctionnement ou *
    * l alteration des donnees de ce systeme constitue une infraction a l'article L.323-1 du Nouveau *
    * Code Penal. Si vous etes connectes par erreur, DECONNECTEZ-VOUS immediatement ! Toute connexion *
    * ou tentative de connexion est journalisee et archivee. *
    * *
    ***************************************************************************************************
    rancid@XXX.XXX.XXX.XXX's password:

    ******************************************************************************
    * Copyright (c) 2010-2017 Hewlett Packard Enterprise Development LP *
    * Without the owner's prior written consent, *
    * no decompiling or reverse-engineering shall be allowed. *
    ******************************************************************************

    <XXX.XXX.XXX.XXX>dis device | inc Slot
    Slot 1
    Slot 2
    Slot 3
    Slot 4
    Slot 5
    <XXX.XXX.XXX.XXX>je suis sur le SLOT n° Slot
    je suis sur le SLOT n° Slot
    je suis sur le SLOT n° Slot
    je suis sur le SLOT n° Slot
    je suis sur le SLOT n° Slot
    je suis sur le SLOT n° <sw-ce-pr-2eme-a2.2-55>
    quit Connection to XXX.XXX.XXX.XXX closed by remote host.
    Connection to XXX.XXX.XXX.XXX closed.
    j'espère avoir été plus clair

  8. #8
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Le cat c'est pour simuler ta commande sur un OS linux comme nous sommes, nous ne sommes pas sur ton switch.
    Du coup bien evidemment dans ton cas faut remplacer ça par ton dis device | inc Slot qui théoriquement produit la même sortie.

  9. #9
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Peux-tu rejouer le même script mais en retirant le sleep 1 ligne 23 pour voir ce que cela donne ?

    Ici, j'utilise une regex qui check la sortie, donc le sleep n'est pas utile et peut engendrer des désynchro.

    Sinon, si tu veux quitter juste derrière, voici encore un exemple ou je quitte le bash avant de traiter le résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    spawn bash
    send "cat /tmp/dis_inc\n"
    expect -indices -re "(Slot.*\[0-9]*)"
    set result $expect_out(0,string)
    send "exit\n"
    sleep 1
    for {set i 1} {$i<[llength $result]} {incr i;incr i} { puts "je suis sur le SLOT n° [lindex $result $i]" }
    Pour information, le puts .... n'est là que pour les tests, c'est lui qui affiche sur l'écran, si tu n'as pas besoin de spécifiquement la valeur mais juste d'une boucle, elle est déjà là, suffit juste que tu remplaces le puts... par tes propres commandes.
    Cordialement.

  10. #10
    Membre régulier
    Inscrit en
    Janvier 2011
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 179
    Points : 107
    Points
    107
    Par défaut
    le exit me fait sortir du device, donc ça ne fonctionne pas. (donc je l'ai retiré pour voir le nouvel enchainement donné)

    Pour le coup de remplacer les arguments après le "puts" je l'avais fait, sans succès (cf. mon message d'avant où j'ai copié collé, et le switch répondait que ce qui était envoyé par le puts sans reprendre la variable) il reprend "je suis sur le SLOT n° Slot" la variable ici c'est "Slot" qu'il récupère au lieu de récupérer le nombre final de ligne (par exemple)

    si je retire le sleep 1 de la ligne 23, la commande du "dis device" ne se lance pas (c'est la joie expect )

  11. #11
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 280
    Points : 12 729
    Points
    12 729
    Par défaut
    ok,

    Déjà, ton expect tourne sur quel système ?
    Que donne comme résultat (pas dans expect, mais en ligne de commande depuis un unix ou linux ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ssh $username@$ip "dis device | inc slot" | od -c
    La seule partie qui m’intéresse c'est toute la partie avec les lignes Slot ...

    Et sinon, que donne ton script expect sans la boucle (juste l'affichage de la string) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #!/usr/bin/expect
    #expect.sh
    set username USER
    set password PASSWORD
    set image IMAGE
     
     
    set ip_file "switches.txt"
    set fid [open $ip_file r]
     
    while {[gets $fid ip] != -1} {
     
     
     
    spawn ssh $username@$ip
    expect "password"
    send "$password\n"
     
    sleep 1
     
    send "dis device | inc Slot \n"
     
    sleep 1 
     
    expect -indices -re "(Slot.*\[0-9]*)"
    puts "$expect_out(0,string)"
     
    send "quit \n"
     
     
    interact
     
    }
     
    close $fid
    Cordialement.

  12. #12
    Membre régulier
    Inscrit en
    Janvier 2011
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 179
    Points : 107
    Points
    107
    Par défaut
    je lance mon script expect sous centos 7

    le script lance donc la session sur le switch après

    pour répondre à ta première ligne :

    [rancid]$ ssh 172.16.201.55 "dis device | inc slot" | od -c


    ***************************************************************************************************
    * *
    * !! AVERTISSEMENT !! *
    * Vous etes connectes sur un systeme dont les acces sont restreints aux personnes habilitees. *
    * Le maintien frauduleux de cette connexion sans autorisation, l entrave du fonctionnement ou *
    * l alteration des donnees de ce systeme constitue une infraction a l'article L.323-1 du Nouveau *
    * Code Penal. Si vous etes connectes par erreur, DECONNECTEZ-VOUS immediatement ! Toute connexion *
    * ou tentative de connexion est journalisee et archivee. *
    * *
    ***************************************************************************************************
    rancid@172.16.201.55's password:
    0000000 \r \n * * * * * * * * * * * * * *
    0000020 * * * * * * * * * * * * * * * *
    *
    0000120 \r \n * C o p y r i g h t ( c
    0000140 ) 2 0 1 0 - 2 0 1 7 H e w l
    0000160 e t t P a c k a r d E n t e
    0000200 r p r i s e D e v e l o p m e
    0000220 n t L P *
    0000240 \r \n * W i t h o u t t h e
    0000260 o w n e r ' s p r i o r w r
    0000300 i t t e n c o n s e n t ,
    0000320
    0000340 *
    0000360 \r \n * n o d e c o m p i l i
    0000400 n g o r r e v e r s e - e n
    0000420 g i n e e r i n g s h a l l
    0000440 b e a l l o w e d .
    0000460 *
    0000500 \r \n * * * * * * * * * * * * * *
    0000520 * * * * * * * * * * * * * * * *
    *
    0000620 \r \n \r \n < s w - c e - p r - 2 e
    0000640 m e - a 2 . 2 - 5 5 > \r \n < s w
    0000660 - c e - p r - 2 e m e - a 2 . 2
    Connection to 172.16.201.55 closed by remote host.
    0000700 - 5 5 >
    0000704
    [rancid~]$

    et voici le retour pour la 2ème partie après exécution du script :

    [rancid ~]$ ./slot.sh
    spawn ssh rancid@172.16.201.55


    ***************************************************************************************************
    * *
    * !! AVERTISSEMENT !! *
    * Vous etes connectes sur un systeme dont les acces sont restreints aux personnes habilitees. *
    * Le maintien frauduleux de cette connexion sans autorisation, l entrave du fonctionnement ou *
    * l alteration des donnees de ce systeme constitue une infraction a l'article L.323-1 du Nouveau *
    * Code Penal. Si vous etes connectes par erreur, DECONNECTEZ-VOUS immediatement ! Toute connexion *
    * ou tentative de connexion est journalisee et archivee. *
    * *
    ***************************************************************************************************
    rancid@172.16.201.55's password:

    ******************************************************************************
    * Copyright (c) 2010-2017 Hewlett Packard Enterprise Development LP *
    * Without the owner's prior written consent, *
    * no decompiling or reverse-engineering shall be allowed. *
    ******************************************************************************

    <sw-ce-pr-2eme-a2.2-55>dis device | inc Slot
    Slot 1
    Slot 2
    Slot 3
    Slot 4
    Slot 5
    <sw-ce-pr-2eme-a2.2-55>Slot
    Slot 1
    Slot 2
    Slot 3
    Slot 4
    Slot 5
    <sw-ce-pr-2eme-a2.2-55>
    quit Connection to 172.16.201.55 closed by remote host.
    Connection to 172.16.201.55 closed.

  13. #13
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Dommage,
    La première commande ne me donne pas ce que je voulais... tant pis.

    Avant de voir pour gérer la récupération des indices de chaque slots, essayons d'avoir une bonne récupération, donc revoici ton script où j'ai juste déplacer le sleep de la ligne 23:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #!/usr/bin/expect
    #expect.sh
    set username USER
    set password PASSWORD
    set image IMAGE
     
     
    set ip_file "switches.txt"
    set fid [open $ip_file r]
     
    while {[gets $fid ip] != -1} {
     
     
     
    spawn ssh $username@$ip
    expect "password"
    send "$password\n"
     
    sleep 1
     
    send "dis device | inc Slot \n"
     
    expect -indices -re "(Slot.*\[0-9]*)"
    sleep 1 
    for {set i 1} {$i<[llength $expect_out(0,string)]} {incr i;incr i} { puts "je suis sur le SLOT n° [lindex $expect_out(0,string) $i]" }
     
    send "quit \n"
     
     
    interact
     
    }
     
    close $fid
    Cordialement.

  14. #14
    Membre régulier
    Inscrit en
    Janvier 2011
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 179
    Points : 107
    Points
    107
    Par défaut
    j'avais déjà fait ce que tu avais donné, ça donne un résultat sympa

    <sw-ce-pr-2eme-a2.2-55>dis device | inc Slot
    Slot 1
    Slot 2je suis sur le SLOT n° Slot
    je suis sur le SLOT n° Slot

    Slot 3
    Slot 4
    Slot 5
    et sur un autre test, il m'affichait que des nombres impairs "1 - 3 - 5 - 7 - 9" et j'avoue que là, je n'avais pas compris non plus haha

  15. #15
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 280
    Points : 12 729
    Points
    12 729
    Par défaut
    J'ai peut-être compris (mais bon, avec expect, on croit souvent avoir compris ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #!/usr/bin/expect
    #expect.sh
    set username USER
    set password PASSWORD
    set image IMAGE
     
     
    set ip_file "switches.txt"
    set fid [open $ip_file r]
     
    while {[gets $fid ip] != -1} {
     
     
     
    spawn ssh $username@$ip
    expect "password"
    send "$password\n"
     
    sleep 1
     
    send "dis device | inc Slot \n"
     
    sleep 1 
     
    expect -indices -re "(Slot.*\[0-9]*)"
    for {set i 2} {$i<[llength $expect_out(0,string)]} {incr i;incr i} { puts "je suis sur le SLOT n° [lindex $expect_out(0,string) $i]" }
     
    send "quit \n"
     
     
    interact
     
    }
     
    close $fid
    Juste pour voir...

    Et tant qu'on y est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #!/usr/bin/expect
    #expect.sh
    set username USER
    set password PASSWORD
    set image IMAGE
     
     
    set ip_file "switches.txt"
    set fid [open $ip_file r]
     
    while {[gets $fid ip] != -1} {
     
     
     
    spawn ssh $username@$ip
    expect "password"
    send "$password\n"
     
    sleep 1
     
    send "dis device | inc Slot \n"
     
    expect -indices -re "(Slot \[0-9]+.*\[0-9]+)"
    for {set i 1} {$i<[llength $expect_out(0,string)]} {incr i;incr i} { puts "je suis sur le SLOT n° [lindex $expect_out(0,string) $i]" }
     
    send "quit \n"
     
     
    interact
     
    }
     
    close $fid
    Cordialement.

  16. #16
    Membre régulier
    Inscrit en
    Janvier 2011
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 179
    Points : 107
    Points
    107
    Par défaut
    en effet, t'as compris j'ai l'impression

    quand je prends ton 2ème code, voici le retour :

    <sw-ce-pr-2eme-a2.2-55>dis device | inc Slot
    Slot 1
    Slot 2
    Slot 3
    Slot 4
    Slot 5
    <sw-ce-pr-2eme-a2.2-55>je suis sur le SLOT n° 1
    je suis sur le SLOT n° 2
    je suis sur le SLOT n° 3
    je suis sur le SLOT n° 4
    je suis sur le SLOT n° 5
    quit Connection to 172.16.201.55 closed by remote host.
    Connection to 172.16.201.55 closed.
    j'ai donc remplacé la phrase par la commande que je souhaite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for {set i 2} {$i<[llength $expect_out(0,string)]} {incr i;incr i} { puts "dir slot[lindex $expect_out(0,string) $i]#flash:/ \n" }
    quand j’exécute, j'ai ça :

    <sw-ce-pr-2eme-a2.2-55>dis device | inc Slot
    Slot 1
    Slot 2
    Slot 3
    Slot 4
    Slot 5
    <sw-ce-pr-2eme-a2.2-55>dir slot1#flash:/

    dir slot2#flash:/

    dir slot3#flash:/

    dir slot4#flash:/

    dir slot5#flash:/
    et je viens de me rendre compte qu'HP est débile, car ils disent bien que le slot 1 existe, mais il correspond pas à "slot1#flash:/" mais à "flash:/"

    en tout cas, même en lui disant de faire un "entrée" pour m'afficher le contenu de la flash, c'est pas pris en compte, on peut rajouter un petit "sleep 1" dans ta ligne de commande ?

  17. #17
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Dans le bloc, tu peux mettre autant de commande que tu veux, donc oui, tu peux mettre un sleep, mais là, ça ne t'affichera pas le contenu non plus, car la commande puts ne fait qu'afficher un message, il faut que tu passe par un send pour que cela soit exécuté.

    Pour information, le langage derrière est du tcl, et la syntaxe de la boucle for est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     for {initialisations} {tests_de_fin_de_boucle} {incrémentations} {
             indentation_et_corps_de_la_boucle
      }
    Cordialement.

  18. #18
    Membre régulier
    Inscrit en
    Janvier 2011
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 179
    Points : 107
    Points
    107
    Par défaut
    rien que de lire ça, ça me fait vomir, je vais voir ce que je peux faire haha

  19. #19
    Membre régulier
    Inscrit en
    Janvier 2011
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 179
    Points : 107
    Points
    107
    Par défaut
    d'ailleurs, le tcl n'est "reconnu" que par cisco, sur HP, je n'ai rien qui ne me permet (comme sur cisco) de faire des scripts pour que le device comprenne ce que je lui dise

  20. #20
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Non, tu n'as pas compris comment ça fonctionne, toute la programmatique tcl est coté client, c'est elle qui permet de discuter et de dire à expect de lancer les commandes qui vont bien à ton serveur cisco ou hp.
    Pour faire simple, il faut voir expect comme un terminal qui possède un langage (ici tcl), qui permet de simuler les actions d'un humain.
    La seule chose vu coté serveur (cisco ou hp dans ton cas), c'est toutes les commande qui sont dans le send "...", toutes les autres comme la boucle for, expect,... ne sont que des commandes pour dire à expect ce qu'il doit faire.

    Le but de expect: tu envoies une commande, tu captures le retour de cette commande mais comme si tu regardais un résultat via une connexion classique à un terminal et tu traite ce résultat.
    Cordialement.

Discussions similaires

  1. copier coller une ligne plusieurs fois selon une valeur de cellule
    Par ghaza dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 05/04/2017, 09h48
  2. Réponses: 3
    Dernier message: 07/10/2016, 14h18
  3. Réponses: 7
    Dernier message: 28/01/2010, 14h44
  4. Réponses: 10
    Dernier message: 20/04/2007, 11h41
  5. [XSL]appliquer la fonction substring sur une valeur récupéré
    Par totoranky dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 22/02/2006, 17h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo