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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2011
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 179
    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 : 34
    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
    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 confirmé
    Inscrit en
    Janvier 2011
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 179
    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 confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    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 376
    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.

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2011
    Messages
    179
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 179
    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 confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    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 376
    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

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