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

Modules Perl Discussion :

module perl Net::SSH::Expect


Sujet :

Modules Perl

  1. #1
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Points : 402
    Points
    402
    Par défaut module perl Net::SSH::Expect
    La connection sur des périphériques via SSH est un problème que j'ai constaté assez récurrent, et assez problématique vis à vis de certains périphériques cisco. Venant de trouver une solution à mon problème, je la poste en ésperant qu'elle pourra en aider certains :

    Donc pour tout ceux qui ont des problèmes avec Net::SSH::Perl ou Perl::SSH2, voir même Net::Appliance::session, voici une piste :

    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/perl
    use Net::SSH::Expect;
     
            my $ssh = Net::SSH::Expect->new (
                host => "192.168.90.100", 
                password=> 'cisco', 
                user => 'admin', 
                raw_pty => 1
            );
     
            my $enable_passwd = "cisco";
     
            my $login_output = $ssh->login();
            $ssh->run_ssh() or die "SSH process couldn't start: $!";
     
            $ssh->send("enable");
            $ssh->waitfor('Password:\s*\z', 1) or die "prompt 'password' not found after 1 second";
            $ssh->send($enable_passwd);
     
            my $ls = $ssh->exec("show hosts");
            print($ls);
     
            # When running a command that causes a huge output,
            # lets get the output line by line:
            $ssh->send("show interfaces");   # using send() instead of exec()
            my $line;
            # returns the next line, removing it from the input stream:
            while ( defined ($line = $ssh->read_line()) ) {
                print $line . "\n";  
            }
     
            # closes the ssh connection
            $ssh->close();
    Je précise que cela est tiré de la doc CPAN, et j'ai simpleéent réduit le script au minimum pour mes besoins.

    Cependant, j'ai un dernier souci : avec ce script, l'execution de plusieurs commandes ne pose aucun problème (plus de soucis de channel), mais lors d'affichage de grande sortie (genre un résultat de commande de plusieurs 10 aines de lignes), je n'arrive pas passer outre le "--More--" de cisco. Donc au final, je n'arrive recuperer dans une variable que la preéière page de l'affichage.

    Si quelqu'un a une piste ou une solution à ce problème...

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    as tu testé cette solution ?

  3. #3
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Points : 402
    Points
    402
    Par défaut
    Personnelement j'ai un problème avec le module Perl::SSH2. Malgrès une installation correcte et sans encombre du module et des dépendances, à chaque éxécution d'un "new" il me dit qu'il ne trouve pas la méthode "put" dans le fichier ssh2.pm...

    Malgrès réinstallation du module à nouveau sans erreur apparente, idem...

    Sinon je viens de me renseigner auprès de professionels cisco, et on m'a donné une commande magique resolvant mon problème :

    avant la commande ayant une sortie trop longue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $ssh->exec(terminal length 0);
    et après la commande, pour revenir a la normal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $ssh->exec(terminal length 24);
    Après cette solution ne sera peut être pas viable en dehors de cisco, mais hors cisco le module Net::SSH:erl fonctionne bien chez moi...

    Néanmoins je te remercie pour ton lien car cela m'a donné quelques idées pour les autres fonctions que j'ai a réaliser.

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Essaye de tester le code que j'ai mis dans les sources avec ton cisco et dit moi s'il fonctionne ou non. Sinon merci pour tes précisions, ça pourra aider du monde je pense.

  5. #5
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Points : 402
    Points
    402
    Par défaut
    J'ai teste la partie connection SSH de ton script, et cela me retourne exactement la même erreur que j'obtient düs que je tente une connection via le module SSH2 :

    Net::SSH2 object version 0.30 does not match bootstrap parameter 0.3 at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/XSLoader.pm line 94.
    apres je suis sous CentOS et je me connecte sur un cisco, donc je ne peux pas tester le transfert de fichier tel qu'indique...

    ps : je viens de tilter que j'ai dit precedement que j'avais l'erreur de la methode "put" introuvable avec Net::SSH2, or cette erreur survient avec le module Net::Appliance::session. je tenais a rectifier.

    Donc pour le moment, seul solution que j'ai trouve pour la connection sur un cisco (tout modeles confondus meme catalyst) passe par l'utilisation du module Net::SSH::Expect.

    Si je parviens a trouver des solutions viables avec les autres modules je ne manquerais pas de vous en faire part.

  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Bon courage

  7. #7
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Points : 402
    Points
    402
    Par défaut
    merci !

    et petit ajout, un peu plus simple pour les commandes a longue sortie :

    au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     $ssh->send("show interfaces");   # using send() instead of exec()
            my $line;
            # returns the next line, removing it from the input stream:
            while ( defined ($line = $ssh->read_line()) ) {
                print $line . "\n";  
            }
    les lignes suivantes fonctionnent parfaitement, mais retourne un prompt a la fin (switch> sur un switch cisco par exemple) en plus du resultat de la commande:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     my @output = $ssh->exec("show interfaces");
    print @output;
    à voir après sur des cas particuliers...


    Edit : erreur de débutant (1 mois de perl et cisco), le passage enable ne fonctionne pas avec les lignes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ssh->send("enable");
            $ssh->waitfor('Password:\s*\z', 1) or die "prompt 'password' not found after 1 second";
            $ssh->send($enable_passwd);
    Cela semblait fonctionner, mais seulement car j'ai testé avec une commande (show interfaces) qui est aussi utilisable en mode Disable. Donc la connection et l'execution en mode disable est bonne, mais pour le moment je suis bloqué au passage enable...

  8. #8
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Points : 402
    Points
    402
    Par défaut
    Probleme resolu pour le passage enable. Il semblerait que le probleme venait soit d'un delai trop court entre la connection et la tentative de passage enable, soit d'un caractüre faussant la premiüre ligne de commande... quoi qu'il en soit, j'ai tentö de repeter l'operation enable et il s'avere que cela fonctionne parfaitement.

    Code utilisö pour passer enable sur cisco :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for(my $i=0;$i<2;$i++){
    	$ssh->send('enable');
    	$ssh->waitfor('Password:\s*\z', 1) or die "prompt 'password' not found after 1 second";
    	$ssh->send($enable_password);
    }
    c'est bourrin... mais ca marche...

  9. #9
    Membre averti

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2010
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2010
    Messages : 246
    Points : 402
    Points
    402
    Par défaut
    Comme promis, je viens de trouver le pourquoi du comment du problème enable. Il s'agissait en fait de la méthode "run_ssh()" qui ne doit s'utiliser que si on ne dispose pas d'identifiants pour la connection.

    Le code finale, fonctionnel et testé est donc celui-ci :

    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/perl
    use Net::SSH::Expect;
     
            my $ssh = Net::SSH::Expect->new (
                host => "192.168.90.100", 
                password=> 'cisco', 
                user => 'admin', 
                raw_pty => 1
            );
     
            my $enable_passwd = "cisco";
     
            my $login_output = $ssh->login();
     
            $ssh->send("enable");
            $ssh->waitfor('Password:\s*\z', 1) or die "prompt 'password' not found after 1 second";
            $ssh->send($enable_passwd);
     
            my $ls = $ssh->exec("show vlan");
            print($ls);
     
     
            #Première façon de récuperer une sortie longue:
            $ssh->send("show running-config");
            my $line;
            while ( defined ($line = $ssh->read_line()) ) {
                print $line . "\n";  
            }
     
            #Deuxième façon (mais on récupère aussi les prompt avec cette méthode):
            my @output = $ssh->exec("show running-config");
            print @output;
     
            $ssh->close();
    Pour les problèmes de longeur de sortie sur le terminal (passage du --more-- sur les cisco), il suffit d'éxécuter la commande suivante avant votre commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ssh->exec("terminal length 0");
    et celle ci après votre commande afin de revenir dans l'état par défaut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ssh->exec("terminal length 24");

    Désolé pour toutes ces modifications, mais avec cette dernière version, le ssh marche parfaitement et on peut éxécuter plusieurs commandes sans soucis. Je l'ai testé sur plusieurs type de switch cisco et plusieurs version d'IOS jusque la avec succès.

    En éspérant que cela puisse vous aider.

    Sinon merci pour les cours de formation et les tutoriels pour apprendre Perl : http://perl.developpez.com/cours/


    ps: pour la lisibilité du topic ne serait-il pas mieux de supprimmer les messages entre le premier et le dernier ? je dis cela car ca ne me derange pas que mes messages intermediaires passent a la trappe si cela aide a la lisibilité.

  10. #10
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Souhaites tu que l'on rajoute ton code dans nos sources de la rubrique Perl. Si oui, Je te suggère de poster un message ici. En y précisant le code et son but. Puis je le mettrais dans les sources.

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

Discussions similaires

  1. [Net::SSH::Expect] Utilisation du module
    Par JLChelin dans le forum Modules
    Réponses: 2
    Dernier message: 21/03/2013, 12h05
  2. Installation du module net:ssh:expect sous windows xp
    Par ngerbault dans le forum Modules
    Réponses: 0
    Dernier message: 24/01/2012, 11h12
  3. Module Perl Net::Packet::Dump
    Par sarnov dans le forum Modules
    Réponses: 2
    Dernier message: 28/01/2009, 13h06
  4. Perl - Net::SSH:Perl
    Par pratheep dans le forum Modules
    Réponses: 3
    Dernier message: 24/11/2008, 21h09
  5. Réponses: 6
    Dernier message: 04/11/2008, 10h51

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