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

Langage Perl Discussion :

passer à l’occurrence suivante


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 87
    Points : 92
    Points
    92
    Par défaut passer à l’occurrence suivante
    Bonjour,

    j'ai un script qui parse un fichier txt rempli d'@IP.
    pour chaque @IP, il se connecte dessus et passe des commandes.

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    while( defined( $host = <FIC2>)) {
     
        chomp($host);
     
        print "*** $host\n" if $verbose;
        print "*** Connexion sur le cpe\n" if $verbose;
     
        $expect = new Expect ();
     
        $expect->exp_internal(1) if $debug;
     
        $expect->raw_pty (1);
        $expect->log_stdout (0);
        $expect->spawn ('ssh -p <port number> mon_login@'.$host);
     
        $expect->expect(10,
          #premiere connexion ssh sur le cpe
          [ qr/yes\/no/ =>
            sub {
                $expect->send("yes\n");
                exp_continue;
            }
          ],
          #login en cas d'échec
          [ qr/ogin:/ =>
            sub {
                $expect->send("mon_login\n");
                exp_continue;
            }
          ],
          #mot de passe
          [ qr/assword:/ =>
            sub {
                $expect->send("mon_password\n");
                exp_continue;
            }
          ],
          #prompt v1, passage en enable
          [ qr/CPE>/ =>
            sub {
                $version = 1;
                $expect->send("enable\n");
                exp_continue;
            }
          ],
          #prompt v1, passage en mode wimax
          [ qr/CPE#/ =>
            sub {
                $expect->send("mode_wimax\n");
                exp_continue;
            }
          ],
          #prompt v1
          [ qr/CPE.*#/ =>
            sub { 1; }
          ],
          #prompt v2, passage en mode enable
          [ qr/MTxxxx>/ =>
            sub {
                $version = 2;
                $expect->send("enable\n");
                exp_continue;
            }
          ],
          #prompt v2, passage en mode wimax
          [ qr/MTxxxx#/ =>
            sub {
                $expect->send("mode_wimax\n");
                exp_continue;
            }
          ],
          #prompt v2
          [ qr/MTxxxx.*#/ =>
            sub { 1; }
          ],
          [ timeout =>
            sub {
                print "timeout\n";
                #ecriture dans les logs
                print ( FIC1 "$host\n");
            }
          ],
          [ eof =>
            sub { 1; }
          ]);
    Ce petit bout de code me permet de me logguer, et de me donner les privilèges nécessaires.
    Lorsque j'ai un timeout, je log dans un fichier l'@IP. Mais j'aimerais aussi qu'il passe à l'host suivant, plutôt que d'essayer de passer des commandes et d'avoir des timeout à chacune d'entre elles...
    je ne peux pas mettre de exit, sinon la liste d'@IP ne sera pas passée, et next ne passe pas dans un sub...

    Auriez-vous une idée svp?

    Merci d'avance,

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Pas le temps là tout de suite de lire ton code en détail et de la comprendre, mais peut-être un return?

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 87
    Points : 92
    Points
    92
    Par défaut
    Salut,

    En gros, il faudrait faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $connexion = $expect->expect(10,
    lorsque j'ai un prompt qui me convient, je fais un return 1, lorsque j'ai un timeout, un return 0, et après ce premier expect, je check la variable $connexion. Si 1, je continue, si 0 je fais un next (vu que je ne serais plus dans un sub de l'expect)

    je teste ça et fais un retour

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 87
    Points : 92
    Points
    92
    Par défaut
    Hello,

    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
    $connexion = $expect->expect(10,
        #premiere connexion ssh sur le cpe
          [ qr/yes\/no/ =>
            sub {
                $expect->send("yes\n");
                exp_continue;
            }
          ],
          #login en cas d'échec
          [ qr/ogin:/ =>
            sub {
                $expect->send("mon_login\n");
                exp_continue;
            }
          ],
    [...]
          #prompt v1
          [ qr/CPE.*#/ =>
            sub {
                return 1;
            }
          ],
          #prompt v2
          [ qr/MTxxxx.*#/ =>
            sub {
                return 1;
            }
          ],
          [ qr/No route to host/ =>
            sub {
                print "injoignable\n" if $verbose;
                #ecriture 
                print ( FIC1 "$host\n");
                return 0;
            }
          ],
          [ timeout =>
            sub {
                print "timeout\n" if $verbose;
                #ecriture 
                print ( FIC1 "$host\n");
                return 0;
            }
          ],
          [ eof =>
            sub { 1; }
          ]);
    ne fonctionne pas. en effet, $connexion prend la valeur de la position de la regexp. j'avais simplifié le code donné pour pas sortir toutes les erreurs, mais voyez que si mon expect match "no route to host" par exemple, j'ai pas un retour de 0, mais de 12 (la position de ma regexp). j'ai bidouillé un peu du coup, pas très propre mais bon... si vous avez des idées je suis preneur:


    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    while( defined( $host = <FIC2>)) {
     
        chomp($host);
     
        print "*** $host\n" if $verbose;
        print "*** Connexion sur le cpe\n" if $verbose;
     
        $expect = new Expect ();
     
        $expect->exp_internal(1) if $debug;
     
        $expect->raw_pty (1);
        $expect->log_stdout (0);
        $expect->spawn ('ssh -p <port number> mon_login@'.$host);
     
        $expect->expect(10,
          #premiere connexion ssh sur le cpe
          [ qr/yes\/no/ =>
            sub {
                $expect->send("yes\n");
                exp_continue;
            }
          ],
          #login en cas d'échec
          [ qr/ogin:/ =>
            sub {
                $expect->send("mon_login\n");
                exp_continue;
            }
          ],
          #mot de passe
          [ qr/assword:/ =>
            sub {
                $expect->send("mon_password\n");
                exp_continue;
            }
          ],
          #prompt v1, passage en enable
          [ qr/CPE>/ =>
            sub {
                $version = 1;
                $expect->send("enable\n");
                exp_continue;
            }
          ],
          #prompt v1, passage en mode wimax
          [ qr/CPE#/ =>
            sub {
                $expect->send("wimax\n");
                exp_continue;
            }
          ],
          #prompt v1
          [ qr/CPE.*#/ =>
            sub {
                $connexion = 1;
            }
          ],
          #prompt v2, passage en mode enable
          [ qr/MTxxxx>/ =>
            sub {
                $version = 2;
                $expect->send("enable\n");
                exp_continue;
            }
          ],
          #prompt v2, passage en mode wimax
          [ qr/MTxxxx#/ =>
            sub {
                $expect->send("wimax\n");
                exp_continue;
            }
          ],
          #prompt v2
          [ qr/MTxxxx.*#/ =>
            sub {
                $connexion = 1;
            }
          ],
          [ qr/No route to host/ =>
            sub {
                print "injoignable\n" if $verbose;
                #ecriture 
                print ( FIC1 "$host\n");
                $connexion = 0;
            }
          ],
          [ timeout =>
            sub {
                print "timeout\n" if $verbose;
                #ecriture 
                print ( FIC1 "$host\n");
                $connexion = 0;
            }
          ],
          [ eof =>
            sub { 1; }
          ]);
     
        next if !$connexion;
     
        suite du script ici: passage des commandes ici
    je n'ai pas mis toutes les erreurs encore pour simplifier

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Toutes versions] Selectionner Cellules - Les fusionner et passer aux suivantes
    Par Roums dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/02/2010, 11h31
  2. Compter le nombre de fichiers dans un dossier et passer au suivant
    Par VictoriusDan dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 19/01/2010, 21h43
  3. Réponses: 7
    Dernier message: 13/08/2009, 09h19
  4. [VB.NET] Timeout - Passer au suivant ?
    Par kyluxox dans le forum VB.NET
    Réponses: 4
    Dernier message: 30/04/2009, 09h51
  5. Réponses: 3
    Dernier message: 21/12/2007, 14h10

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