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

  1. #1
    Membre habitué
    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
    Points : 156
    Points
    156
    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 chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    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 392
    Points : 2 044
    Points
    2 044
    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 chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    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 392
    Points : 2 044
    Points
    2 044
    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 habitué
    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
    Points : 156
    Points
    156
    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 chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    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 392
    Points : 2 044
    Points
    2 044
    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 chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    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 392
    Points : 2 044
    Points
    2 044
    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";

  7. #7
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    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 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Je ne suis pas certain de ne pas trop faire de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ssh->eat($ssh->peek(0));
    while ($chunk = $ssh->peek(1)) { # grabs chunks of output each 1 second
            print $ssh->eat($chunk);
    }
    Mais ça fonctionne !

    Le dernier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while ($chunk = $ssh->peek(1)) { # grabs chunks of output each 1 second
            print $ssh->eat($chunk);
    }
     
    print "FIN\n";
    m'a été nécessaire, sans lui à la fin du traitement j'avais 3 prompts espacés de 1s et sans retour à la ligne

    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
    print "Connexion OK\n\n";
    print $FILE "Connexion OK\n\n";
     
    my $login_output = $ssh->login();
            if ($login_output !~ /Welcome/) {
                die "Login has failed. Login output was $login_output";
            }
     
    print $FILE "COMMANDE 01 - ls -l\n\n";
    $ssh->send("ls -l");
    while (my $line = $ssh->read_line())
    {
            print $FILE "$line\n";
    }
    $ssh->eat($ssh->peek(0));
    while ($chunk = $ssh->peek(1)) { # grabs chunks of output each 1 second
            print $ssh->eat($chunk);
    }
    print $FILE "\n\n\n";
     
    print $FILE "COMMANDE 02 - ps -l\n\n";
    $ssh->send("ps -l");
    while (my $line = $ssh->read_line())
    {
            print $FILE "$line\n";
    }
    $ssh->eat($ssh->peek(0));
    while ($chunk = $ssh->peek(1)) { # grabs chunks of output each 1 second
            print $ssh->eat($chunk);
    }
    print $FILE "\n\n\n";
     
    print $FILE "COMMANDE 03 - route -n\n\n";
    $ssh->send("route -n");
    while (my $line = $ssh->read_line())
    {
            print $FILE "$line\n";
    }
    $ssh->eat($ssh->peek(0));
    while ($chunk = $ssh->peek(1)) { # grabs chunks of output each 1 second
            print $ssh->eat($chunk);
    }
    print $FILE "\n\n\n";
     
    while ($chunk = $ssh->peek(1)) { # grabs chunks of output each 1 second
            print $ssh->eat($chunk);
    }
     
    print "FIN\n";
    print $FILE "FIN\n";
    close $FILE;
    michel@MIDO:/media/michel/DATA Win/_DEV/ciols$
    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
    michel@MIDO:/media/michel/DATA Win/_DEV/ciols$ cat config_p.txt
    Connexion OK
     
    COMMANDE 01 - ls -l
     
    total 48
    drwxr-xr-x 2 dufour dufour 4096 juin  12  2014 Bureau
    drwxr-xr-x 2 dufour dufour 4096 juin  12  2014 Documents
    -rw-r--r-- 1 dufour dufour 8980 juin  12  2014 examples.desktop
    drwxr-xr-x 2 dufour dufour 4096 juin  12  2014 Images
    drwxr-xr-x 2 dufour dufour 4096 juin  12  2014 Modèles
    drwxr-xr-x 2 dufour dufour 4096 juin  12  2014 Musique
    drwxrwxr-x 5 dufour dufour 4096 déc.  16 05:54 perl5
    drwxr-xr-x 2 dufour dufour 4096 juin  12  2014 Public
    drwxr-xr-x 2 dufour dufour 4096 juin  12  2014 Téléchargements
    drwxr-xr-x 2 dufour dufour 4096 juin  12  2014 Vidéos
     
     
     
    COMMANDE 02 - ps -l
     
    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    0 S  1000  5359  5358  2  80   0 -  6754 wait   pts/1    00:00:00 bash
    0 R  1000  5378  5359  0  80   0 -  3560 -      pts/1    00:00:00 ps
     
     
     
    COMMANDE 03 - route -n
     
    Table de routage IP du noyau
    Destination     Passerelle      Genmask         Indic Metric Ref    Use Iface
    0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 wlan0
    192.168.1.0     0.0.0.0         255.255.255.0   U     9      0        0 wlan0
     
     
     
    FIN
    michel@MIDO:/media/michel/DATA Win/_DEV/ciols$
    C'est fait à partir de copier/coller d'ici ou là, ce n'est pas beau, l'indentation n'est pas cohérente...
    Là sur Linux je n'ai pas réinstallé mon éditeur préféré...
    Il fallait bien que je t'en laisse un peu...
    Bref toutes les excuses sont bonnes !
    @+

    [EDIT 20/12 06:50]
    En fait non, je viens de faire d'autres essais, c'est complètement le foutoir !

    Ceci est OK pour moi :
    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
    my $ssh = Net::SSH::Expect->new (
                host => $host,
                password=> $password,
                user => $user,
                raw_pty => 1
            );
     
    print "Connexion OK\n\n";
    print $FILE "Connexion OK\n\n";
     
    my $login_output = $ssh->login();
            if ($login_output !~ /Welcome/) {
                die "Login has failed. Login output was $login_output";
            }
     
    print $FILE "COMMANDE 01 - ls -l\n\n";
    $ssh->send("ls -l");
    while (my $line = $ssh->read_line())
    {
            print $FILE "$line\n";
    }
    $ssh->eat($ssh->peek(0));
    print $FILE "\n\n\n";
     
    print $FILE "COMMANDE 02 - ps -l\n\n";
    $ssh->send("ps -l");
    while (my $line = $ssh->read_line())
    {
            print $FILE "$line\n";
    }
    $ssh->eat($ssh->peek(0));
    print $FILE "\n\n\n";
     
    print $FILE "COMMANDE 03 - route -n\n\n";
    $ssh->send("route -n");
    while (my $line = $ssh->read_line())
    {
            print $FILE "$line\n";
    }
    $ssh->eat($ssh->peek(0));
    print $FILE "\n\n\n";
     
     
    print "FIN\n";
    print $FILE "FIN\n";
    close $FILE;
    Et ce qui suit n'est pas bon !
    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
    print "Connexion OK\n\n";
    print $FILE "Connexion OK\n\n";
     
    my $login_output = $ssh->login();
            if ($login_output !~ /Welcome/) {
                die "Login has failed. Login output was $login_output";
            }
     
    my @ls = $ssh->exec("ls -l /");
            print $FILE @ls;
    $ssh->eat($ssh->peek(0));
    print $FILE "\n\n\n";
    #$ssh->eat($ssh->peek(0));
     
     
    my @ps = $ssh->exec("ps -l");
            print $FILE @ps;
    $ssh->eat($ssh->peek(0));
    print $FILE "\n\n\n";
    #$ssh->eat($ssh->peek(0));
     
     
    @ls = $ssh->exec("ls -l /");
            print $FILE @ls;
    $ssh->eat($ssh->peek(0));
    print $FILE "\n\n\n";
    #$ssh->eat($ssh->peek(0));
     
     
    print $FILE "COMMANDE 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";
    close $FILE;
    quelquesoit l'emplacement et le nombre de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ssh->eat($ssh->peek(0));
    et idem avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while ($chunk = $ssh->peek(1)) { # grabs chunks of output each 1 second
            print $ssh->eat($chunk);
    }
    Donc je donne ma langue au chat !


    Il ne reste plus qu'à prendre le fichier config_p.txt une fois constitué et à lui supprimer les lignes qui commencent par $user

  8. #8
    Membre habitué
    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
    Points : 156
    Points
    156
    Par défaut
    Vraiment pas mal ta solution ! Je vais essayer de faire comme ça !

    EDIT : Avec la solution de virer les prompt avec une regex est vraiment pas mal ! Pourquoi faire compliqué quand on peut faire simple ? x)

    Voici le code qui permet de faire ça :

    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
     
    open(FILE,">config_pcrf.txt") or die ("Erreur d'ouverture du fichier\n");
     
    [...] Opérations de remplissage du fichier
     
    close(FILE);
     
    open(FILE,"config.txt") or die ("Erreur d'ouverture du fichier\n");
    my @lines = <FILE>;
    close(FILE);
     
    print "OK\n";
     
    open (FIC, ">config_".$date.".txt") or die ("Erreur d'ouverture\n");
     
    my $re1 ='(\\[.*?\\]#(.*?))';
     
    foreach (@lines)
    {
            chomp($_);
            if ($_ !~ m/$re1/is)
            {
                    print FIC "$_\n";
            }
            else
            {
                    print FIC "$2\n";
            }
    }
     
    close (FIC);
    Merci encore et bonne journée !

    PS : Je ne sais pas si le code est optimisé mais, au moins, il marche !

  9. #9
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    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 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Bonjour,
    PS : Je ne sais pas si le code est optimisé mais, au moins, il marche !
    Si ça marche c'est l'essentiel !

    Une petite remarque, tu n'as pas besoin d'enlever le '\n' à l'aide de chomp puisque tu l'ajoutes à tes print
    Ceci devrait suffire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    foreach (@lines)
    {
            if ($_ !~ m/$re1/is)
            {
                    print FIC "$_";
            }
            else
            {
                    print FIC "$2";
            }
    }
    ATTENTION de bien avoir le même prompt sur TOUTES tes machines.
    Si pour une raison ou une autre un utilisateur modifie son prompt dans son .bashrc, tu auras des surprises. Exemple :

    Perso je me mettais un prompt à rallonge qui me permetait de connaître entre autre la machine , l'utilisateur Unix et la base Oracle (SID) sur laquelle je pouvais intervenir, l'utilisateur Oracle et enfin le répertoire courant, ça donnait :

    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
    SMSO=`tput smso`
    RMSO=`tput rmso`
    DR='^[[1m'
    FR='^[[0m^O'
    DJ='^[[1;4m'
    FJ='^[[0m^O'
    DB='^[[4m'
    FB='^[[0m^O'
    export SMSO RMSO DR FR DJ FJ DB FB
    DAT=`date '+%d/%m/%y'`
    TTY=`tty | cut -c6-`
    MAC=`uname -n`
    WHO=`whoami`
    LOGIN=`whoami`
    PS1='
    $DJ$ORACLE_SID$FJ
    $MAC $TTY $DR$LOGIN$FR (!)
    $PWD
    # '; export PS1
    PS2='
    $MAC $LOGIN (!)
    $PWD
    # '; export PS2
    le prompt avec les infos en couleur avait cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MIDO pts/7 michel (!)
    Pinf DBA
    /home/michel 
    #
    Il faut dire que je devais jongler avec les machines, les bases, les utilisateurs... une erreur pouvait causer des dégats condidérables...

    Donc si sur une machine dont le prompt a été modifié dans le .bashrc, on passe le script ssh.pl récalcitrant avec les prompts, le résultat est :
    là je n'ai pas de base :
    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
    ...
    ...
    
    DOMI pts/15 dufour (!)
    /home/dufour 
    # 
    
    
    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  4280 déc.  22 15:01 dev
    drwxr-xr-x 132 root root 12288 déc.  22 14:55 etc
    drwxr-xr-x   4 root root  4096 juin  12  2014 home
    lrwxrwxrwx   1 root root    33 juin  12  2014 initrd.img -> boot/initrd.img-3.13.0-24-generic
    drwxr-xr-x  23 root root  4096 juin  12  2014 lib
    drwxr-xr-x   2 root root  4096 avril 17  2014 lib64
    drwx------   2 root root 16384 juin  12  2014 lost+found
    drwxr-xr-x   3 root root  4096 juin  12  2014 media
    drwxr-xr-x   2 root root  4096 avril 11  2014 mnt
    drwxr-xr-x   2 root root  4096 avril 17  2014 opt
    dr-xr-xr-x 210 root root     0 déc.  22  2014 proc
    drwx------   6 root root  4096 déc.  17 08:24 root
    drwxr-xr-x  24 root root   780 déc.  22 15:21 run
    drwxr-xr-x   2 root root 12288 juin  12  2014 sbin
    drwxr-xr-x   2 root root  4096 avril 17  2014 srv
    dr-xr-xr-x  13 root root     0 déc.  22  2014 sys
    drwxrwxrwt   5 root root  4096 déc.  22 15:17 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
    
    
    DOMI pts/15 dufour (!)
    /home/dufour 
    # 
    
    
    COMMANDE 01 - ps -l
    
    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    0 S  1000  3633  3632  1  80   0 -  6796 wait   pts/15   00:00:00 bash
    0 R  1000  3677  3633  0  80   0 -  3560 -      pts/15   00:00:00 ps
    FIN
    
    
    MIDO pts/0 michel (!)
    /media/michel/DATA Win/_DEV/ciols 
    # [/B]
    Bon c'était juste une info pour t'empêcher de dormir

  10. #10
    Membre habitué
    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
    Points : 156
    Points
    156
    Par défaut
    C'est la première fois que je vois un prompt sur plusieurs lignes ! Ça fait drôle !

    Merci pour informations qui enrichiront ma culture !

    Bonne soirée !

  11. #11
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    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 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Ça fait drôle !
    Oui, il faisait rigoler mes collègues...
    Il faut dire qu'il faut en avoir l'utilité...
    Bonne soirée !

  12. #12
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    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 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Bonjour,
    Plutôt que de reprendre le fichier constitué, de ce qui précède concernant le prompt, il serait préférable de modifier le prompt avec Net::OpenSSH !

    Le code devient :
    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
    print "Connexion OK\n\n";
    print $FILE "Connexion OK\n\n";
    
    my $login_output = $ssh->login();
            if ($login_output !~ /Welcome/) {
                die "Login has failed. Login output was $login_output";
            }
    
    $ssh->exec("export PS1=''");
    # ou tout autre chose : $ssh->exec("export PS1='\n'");
    
    my @ls = $ssh->exec("ls -l /");
            print $FILE @ls;
    $ssh->eat($ssh->peek(0));
    print $FILE "\n\n\n";
    #$ssh->eat($ssh->peek(0));
    
    
    my @ps = $ssh->exec("ps -l");
            print $FILE @ps;
    $ssh->eat($ssh->peek(0));
    print $FILE "\n\n\n";
    ...
    ...
    Ainsi plus de pb si l'utiisateur modifie son prompt dans .bashrc :
    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
    MIDO pts/3 michel (!)
    /media/michel/DATA Win/_DEV/ciols 
    # perl OpenSSH_0.pl
    ==> Connexion SSH en cours...
    Connexion OK
     
    FIN
     
     
    MIDO pts/3 michel (!)
    /media/michel/DATA Win/_DEV/ciols 
    # cat config_p.txt
    ...
    ...
    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    0 S  1000  2103  2102  2  80   0 -  6796 wait   pts/10   00:00:00 bash
    0 R  1000  2147  2103  0  80   0 -  3560 -      pts/10   00:00:00 ps
     
     
     
     
    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  4220 déc.  23 04:59 dev
    drwxr-xr-x 132 root root 12288 déc.  23 04:59 etc
    drwxr-xr-x   4 root root  4096 juin  12  2014 home
    lrwxrwxrwx   1 root root    33 juin  12  2014 initrd.img -> boot/initrd.img-3.13.0-24-generic
    drwxr-xr-x  23 root root  4096 juin  12  2014 lib
    drwxr-xr-x   2 root root  4096 avril 17  2014 lib64
    drwx------   2 root root 16384 juin  12  2014 lost+found
    drwxr-xr-x   3 root root  4096 juin  12  2014 media
    drwxr-xr-x   2 root root  4096 avril 11  2014 mnt
    drwxr-xr-x   2 root root  4096 avril 17  2014 opt
    dr-xr-xr-x 169 root root     0 déc.  23  2014 proc
    drwx------   6 root root  4096 déc.  17 08:24 root
    drwxr-xr-x  23 root root   760 déc.  23 05:20 run
    drwxr-xr-x   2 root root 12288 juin  12  2014 sbin
    drwxr-xr-x   2 root root  4096 avril 17  2014 srv
    dr-xr-xr-x  13 root root     0 déc.  23  2014 sys
    drwxrwxrwt   4 root root  4096 déc.  23 05:21 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
     
     
     
     
    COMMANDE 01 - ps -l
     
    F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
    0 S  1000  2103  2102  1  80   0 -  6796 wait   pts/10   00:00:00 bash
    0 R  1000  2149  2103  0  80   0 -  3560 -      pts/10   00:00:00 ps
    FIN
     
     
    MIDO pts/3 michel (!)
    /media/michel/DATA Win/_DEV/ciols 
    #
    J'aurais dû y penser avant !

  13. #13
    Membre habitué
    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
    Points : 156
    Points
    156
    Par défaut
    Cette commande permet de modifier le prompt de manière non permanente ?

  14. #14
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    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 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Citation Envoyé par ciols
    Cette commande permet de modifier le prompt de manière non permanente ?
    Oui !
    C'est le principe de l'export d'une variable :
    1 - Elle demeure à la valeur initialisée, uniquement durant la vie du processus qui l'a lancé, et uniquement pour ce processus. Pour une connexion par exemple, c'est durant la durée de vie du shell.
    2 - Si un autre processus valide la "même" variable, en fait une autre variable mais qui à le même nom que la précédente dans un environnement différent, les 2 variables conservent chacune leur valeur dans leur environnement respectif. Elles sont indépendantes.

    Donc :
    - Si un utilisateur modifie son prompt initial dans .bashrc, il verra la valeur qu'il a attribué, durant toute la durée de sa connexion, ou jusqu'à ce qui le modifie à nouveau lui-même, soit de façon volatile en tapant directement dans une console la commande export PS1='\n\nCOUCOU\n#' soit de façon permanente en modifiant son .bashrc.
    - De même que le programme ssh.pl lorsqu'il se connecte sur la machine distante, se voit attribué un environnement de "base" donc le prompt de "base" attribué à tout utilisateur et qu'il peut modifier.

    S'il n'en était pas ainsi, tous les utilisateurs se connectant sur la même machine seraient contraint de travailler dans le même environnement.
    Par exemple on ne pourrait faire tourner qu'une seule base de données sur une machine, tous les utilisateurs connectés à cette machine seraient contraints de travailler sur la même base...

  15. #15
    Membre habitué
    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
    Points : 156
    Points
    156
    Par défaut
    Parfait parfait !

    Merci pour toutes ces explications détaillées c'est bien utile !!

    Bonne fin de journée !

+ 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