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

Programmation et administration système Perl Discussion :

Net::SSH::Expect, read_line et prompt


Sujet :

Programmation et administration système Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Par défaut Net::SSH::Expect, read_line et prompt
    Bonjour,

    Mon problème est le suivant, quand je lance la 1ère commande ci-dessous, il m'affiche le résultat dans le fichier mais aussi le prompt.
    J'ai fais quelques tests, read_line() = l'ensemble des données (hors prompt), ce qui fait que $ssh->peek() = l'ensemble des données (hors prompt). Hors avec cette information, je n'arrive pas à virer le prompt.

    Si je fais comme les autres, $ssh->eat($ssh->peek(0)), je supprime toutes les informations !

    Voici le code :

    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
    print FILE "\nxx - yumconf -l\n\n";
     
    $ssh->send("yumconf -l");
    while (my $line = $ssh->read_all())
    {
            print FILE "$line\n";
    }
     
    print FILE "\nxx - list tcpdump\n\n";
     
    $ssh->send("yum list installed | grep tcpdump");
    while (my $line = $ssh->read_line())
    {
            print FILE "$line\n";
    }
    $ssh->eat($ssh->peek(0));
     
    print FILE "\nxx - list libpcap\n\n";
     
    $ssh->send("yum list installed | grep libpcap");
    while (my $line = $ssh->read_line())
    {
            print FILE "$line\n";
    }
    $ssh->eat($ssh->peek(0));
     
    print FILE "\nxx - list lksctp-tools\n\n";
     
    $ssh->send("yum list installed | grep lksctp-tools");
    while (my $line = $ssh->read_line())
    {
            print FILE "$line\n";
    }
    $ssh->eat($ssh->peek(0));
    Le contenu de mon fichier
    xx - yumconf -l


    YUM-REPOSITORY : STATUS
    -------------- --------
    common-G02 ---------- : enable
    common-rhel6 ---------- : enable


    [root@xxxxxx ~]# Le prompt à virer

    xx - list tcpdump

    tcpdump.x86_64 ... @CONFIGURATOR

    xx - list libpcap

    libpcap.x86_64 ... @standard

    xx - list lksctp-tools

    lksctp-tools.x86_64 ... @standard

    Une idée ?

    Merci d'avance !

  2. #2
    Membre Expert Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 452
    Par défaut
    Bonjour,
    J'avais bien vu ton message hier soir, mais sans possibilité de tester je me suis abstenu...
    Je n'ai pas le temps de mettre mes Linux à niveau, mais tant pis :
    Dans la mesure où ça fonctionne pour les autres, je n'ai pas beaucoup d'idée.

    Il se peut qu'il y ait ici aussi un pb de tempo...
    As-tu essayé de jouer avec l'emplacement de la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ssh->eat($ssh->peek(0));
    La placer avant la boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    print FILE "\nxx - yumconf -l\n\n";
     
    $ssh->send("yumconf -l");
    $ssh->eat($ssh->peek(0));
    while (my $line = $ssh->read_all())
    {
            print FILE "$line\n";
    }
    Ou même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ssh->eat($ssh->peek(0));
    print FILE "\nxx - yumconf -l\n\n";
     
    $ssh->send("yumconf -l");
    while (my $line = $ssh->read_all())
    {
            print FILE "$line\n";
    }
    et même de jouer avec une tempo supérieure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    print FILE "\nxx - yumconf -l\n\n";
     
    $ssh->send("yumconf -l");
    $ssh->eat($ssh->peek(1));
    while (my $line = $ssh->read_all())
    {
            print FILE "$line\n";
    }
    ou +
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ssh->eat($ssh->peek(n));
    Ou encore en faisant un sleep au début du script...
    Ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    print FILE "\nxx - yumconf -l\n\n";
     
    $ssh->send("yumconf -l");
    $ssh->eat($ssh->peek(0));
    sleep(1);
    while (my $line = $ssh->read_all())
    {
            print FILE "$line\n";
    }
    Enfin tout ce qui pourrait le retenir de tout manger au début !
    Après il serait repu, ça fonctionnerait mieux...

  3. #3
    Membre Expert Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 452
    Par défaut
    Bon j'ai fait une MàJ sommaire d'un Linux.
    Je ne te promets rien !

    J'ai déjà un pb :
    ssh en manuel c'est OK :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    michel@MIDO:/media/michel/DATA Win/_DEV/ciols$ ssh dufour@192.168.1.12
    dufour@192.168.1.12's password: 
    Welcome to Ubuntu 14.04 LTS (GNU/Linux 3.13.0-24-generic x86_64)
     
     * Documentation:  https://help.ubuntu.com/
     
    Last login: Fri Dec 19 07:43:50 2014 from mido.home
    dufour@DOMI:~$
    en Net::OpenSSH je tombe en time out :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    michel@MIDO:/media/michel/DATA Win/_DEV/ciols$ perl OpenSSH.pl
    ==> Connexion SSH en cours...
    unable to connect to remote host :
    unable to establish master SSH connection: login timeout at OpenSSH.pl line 52.
    michel@MIDO:/media/michel/DATA Win/_DEV/ciols$
    Le code :
    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
    #########################
    ###   Connexion SSH   ###
    #########################
    my $host = "168.192.1.12";
    my $user = "dufour";
    my $password = "xxxx";
     
    print "==> Connexion SSH en cours...\n";
     
    my %param=(
        user => $user,
        password=> $password,
        timeout => 10,
        port => '22'
        );
    my $ssh = Net::OpenSSH->new($host,%param);
    $ssh->error and die "unable to connect to remote host :\n". $ssh->error;
     
    print "Connexion OK\n";
    Il me semble que tu faisais état d'un pb de sleep quelque part mais je ne trouve plus
    Je m'absente en début de matinée...
    @+

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Par défaut
    Hello, merci encore pour l'aide et la maj de la linux

    J'ai testé le eat un peu partout (dans la boucle, avant, après, avec un sleep, ...) mais aucun résultat concluant pour le moment...

    En ce qui concerne ton problème, ce n'est pas un problème de sleep ou autre, le sleep permettra une fois que la connexion marche d'attendre d'avoir le prompt afin de lancer des commandes.

    Ce message d'erreur vient sûrement d'un problème de permissions : J'ai trouvé ça sur le net

    Essaye de changer le niveau de débug : $Net::OpenSSH::debug |= 16;

  5. #5
    Membre Expert Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 452
    Par défaut
    merci encore pour l'aide et la maj de la linux
    De rien, c'est encore moi le premier intéressé !

    J'ai testé le eat un peu partout (dans la boucle, avant, après, avec un sleep, ...) mais aucun résultat concluant pour le moment...
    Pas d'autre idée pour l'instant.

    Ce message d'erreur vient sûrement d'un problème de permissions : J'ai trouvé ça sur le net
    MERCI pour le lien !

    Ce qui m'a fait écarté pour l'instant un problème de permission :
    - entre 2 Linux, ssh directement depuis un terminal => OK
    - depuis Win7, ssh directement depuis une invite commandes => OK
    - depuis Win 7, en Perl avec Net::SSH2 => OK

    Et lorsque je bétonne du côté Linux avec dans /etc/hosts.deny:
    - depuis Win7, ssh directement depuis une invite commandes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    E:\_DEV>ssh dufour@192.168.1.12
    ssh_exchange_identification: read: Connection reset by peer
    - depuis Win 7, en Perl avec Net::SSH2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Entrez login : dufour
     
    Entrez le mot de passe : xxxx
     
    Chargement du fichier contenant la liste des equipements...OK
     
    Chargement du fichier contenant la liste des commandes 'liste.commandes'...OK
     
    Creation du fichier de log...OK
     
    192.168.1.13 Connexion impossible : Une tentative de connexion a ΘchouΘ car le parti conne
    ctΘ nÆa pas rΘpondu convenablement au-delα dÆune certaine durΘe ou une connexion Θtablie a
     ΘchouΘ car lÆh⌠te de connexion nÆa pas rΘpondu.
    Autrement dit lorsqu'il y a pb de permission c'est un peu plus explicite, ça ne tombe pas en time out.

    C'était pour te donner une idée des messages...

    Ne perds pas ton temps avec mon pb...
    Moi je n'ai de compte à rendre à personne...

    Si j'ai une idée je reviens, mais là je suis plutôt sec...
    Et mon unique neurone est noyé dans des calculs de coordonnées avec un astrolabe

    PS: Je sais quand même qu'entre temps on a inventé le GPS, mais c'est moins rigolo
    @+

  6. #6
    Membre Expert Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 452
    Par défaut
    Tu aurais pu me le dire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #########################
    ###   Connexion SSH   ###
    #########################
    my $host = "168.192.1.12";
    my $user = "dufour";
    my $password = "xxxx";
    Quel âne je fais c'est 192.168.1.12

    Bon là ça connecte.
    Perso :
    1) je n'arrive à enlever aucun prompt
    2) les $ssh->exec fonctionnent
    3) les $ssh->send fonctionnent

    c'est du vite fait, comme un cochon :

    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
    drwxrwxrwt   4 root root  4096 déc.  19 18:33 tmp
    drwxr-xr-x  10 root root  4096 avril 17  2014 usr
    drwxr-xr-x  13 root root  4096 avril 17  2014 var
    lrwxrwxrwx   1 root root    30 juin  12  2014 vmlinuz -> boot/vmlinuz-3.13.0-24-generic
    dufour@DOMI:~$ 
     
     
    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    0 S  1000  3163  3162  3  80   0 -  6754 wait   pts/9    00:00:00 bash
    0 R  1000  3182  3163  0  80   0 -  3560 -      pts/9    00:00:00 ps
    dufour@DOMI:~$ 
     
     
    total 96
    drwxr-xr-x   2 root root  4096 juin  12  2014 bin
    drwxr-xr-x   3 root root  4096 juin  12  2014 boot
    drwxrwxr-x   2 root root  4096 juin  12  2014 cdrom
    drwxr-xr-x  17 root root  4240 déc.  19 16:44 dev
    drwxr-xr-x 132 root root 12288 déc.  19 16:44 etc
    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
    my @ls = $ssh->exec("ls -l /");
            print FILE @ls;
    $ssh->eat($ssh->peek(0));
    print FILE "\n\n\n";
     
     
    my @ps = $ssh->exec("ps -l");
            print FILE @ps;
    $ssh->eat($ssh->peek(0));
    print FILE "\n\n\n";
     
    @ls = $ssh->exec("ls -l /");
            print FILE @ls;
    $ssh->eat($ssh->peek(0));
    print FILE "\n\n\n";
     
     
    print(FILE "01 - ps -l\n\n");
    $ssh->send("ps -l");
     
    while (my $line = $ssh->read_line())
    {
            print FILE "$line\n";
    }
    $ssh->eat($ssh->peek(0));
     
     
    print "FIN\n";
    print FILE "FIN\n";

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

Discussions similaires

  1. Net::SSH::Expect matcher avec la commande waitfor
    Par caramon _majere dans le forum Langage
    Réponses: 3
    Dernier message: 16/06/2014, 18h54
  2. [Net::SSH::Expect] Utilisation du module
    Par JLChelin dans le forum Modules
    Réponses: 2
    Dernier message: 21/03/2013, 11h05
  3. Installation du module net:ssh:expect sous windows xp
    Par ngerbault dans le forum Modules
    Réponses: 0
    Dernier message: 24/01/2012, 10h12
  4. module perl Net::SSH::Expect
    Par michon dans le forum Modules
    Réponses: 9
    Dernier message: 29/06/2010, 12h42
  5. [Net::SSH] Problème de ciphers
    Par GLDavid dans le forum Modules
    Réponses: 1
    Dernier message: 09/05/2006, 11h02

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