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 :

Connexion SSH à plusieurs machines


Sujet :

Modules 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 Connexion SSH à plusieurs machines
    Bonjour,

    Je dois finir un petit script d'exploitation qui permet de récupérer les configurations des machines. Je récupère leurs @IP et les stock dans un tableau.

    Ensuite je boucle sur ce tableau et je me connecte en SSH sur chacune d'entre elles.

    Exemple :
    @IPA
    @IPB
    @IPC

    Je me connecte d'abord sur A, tout va bien, je me déconnecte. Maintenant je veux me connecter sur B. Sauf que la connexion échoue et de ce fait, mon programme s'arrete et ne se lance pas sur la machine C.

    Avez-vous une idée de comment faire pour que si la connexion échoue, le script continue quand même ?

    J'utilise cette fonction de connexion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sub connexionSSH {
      ($host) = @_;
      print "host = ".$host."\n";
      $ssh = Net::OpenSSH->new($host, user => $user, password => $password, master_stderr_discard => 1,master_opts => [-o => "StrictHostKeyChecking=no"]);
      $ssh->error and die "Erreur lors de la connexion : ".$ssh->error;
    }
    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
    A tout hasard, en remplaçant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $ssh->error and die "Erreur lors de la connexion : ".$ssh->error;
    par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $ssh->error and warn "Erreur lors de la connexion : ".$ssh->error;
    ça donne quoi?

  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
    Bonjour,

    Sur la même idée de Lolo78, juste pour voir, fait un essai en supprimant $ssh->error

    Ou contrôler la connexion avec qqc comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my $login = $ssh->login();
            if ($login !~ /Welcome/) {
                die "Login has failed. Login output was $login";
            }
    et passer à la connexion suivante...

    J'imagine que B est réellement indisponible, sinon une petite tempo entre les différentes connexions.

  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
    J'ai essayé le warn, sans succès.

    Je vais essayer l'autre solution en supprimant le $ssh->error !

  5. #5
    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
    Bonjour,

    Sans succès veut dire ?
    Merci de donner plus d'informations, de nous donner les messages s'affichant.

  6. #6
    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
    Voici mes erreurs :

    xx.xx.xx.1
    xx.xx.xx.2
    ==> Connexion SSH en cours...
    host = xx.xx.xx.1
    Erreur lors de la connexion : unable to establish master SSH connection: login timeout at ./recuperation_conf_pcrf.pl line 252, <> line 79.
    host = xx.xx.xx.1
    Use of uninitialized value in scalar chomp at ./recuperation_conf_pcrf.pl line 307, <> line 79.
    Use of uninitialized value in concatenation (.) or string at ./recuperation_conf_pcrf.pl line 310, <> line 79.
    Use of uninitialized value in concatenation (.) or string at ./recuperation_conf_pcrf.pl line 310, <> line 79.
    operation didn't complete sucessfullyunable to establish master SSH connection: login timeout at ./recuperation_conf_pcrf.pl line 351, <> line 79.
    remote command failed : unable to establish master SSH connection: login timeout at ./recuperation_conf_pcrf.pl line 365, <> line 79.
    remote command failed : unable to establish master SSH connection: login timeout at ./recuperation_conf_pcrf.pl line 379, <> line 79.
    remonte command failed : unable to establish master SSH connection: login timeout at ./recuperation_conf_pcrf.pl line 395, <> line 79.
    remote command failed : unable to establish master SSH connection: login timeout at ./recuperation_conf_pcrf.pl line 409, <> line 79.
    remote command failed : unable to establish master SSH connection: login timeout at ./recuperation_conf_pcrf.pl line 420, <> line 79.
    SSHAuthenticationError Login timed out. The input stream currently has the contents bellow: at /usr/lib/perl5/site_perl/5.8.8/Expect.pm line 828
    Dans cet exemple, je n'arrive pas à me connecter à la .1, cependant, je ne passe tout de même pas à la .2. De plus, la plupart des erreurs qui suivent sont le fruit de l'échec de la connexion.

    Et voici le fonctionnel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    GetOptions ("range=s" => \$range) or die("Error in command line arguments\n");
    $mem = $range;
    if (defined($range)) {
      recuperationIP($range);
      for (my $i = 0 ; $i < scalar(@tabIP) ; $i++) {
        recupConf($tabIP[$i]);
      }  
    }
    RecupConf est la fonction qui appellera la connexion SSH et les différentes commandes afin de récupérer la configuration de chaque équipement.
    Il faudrait que lors d'un échec de connexion je puisse sortir de la fonction recupConf afin de continuer dans ma boucle for (my $i = 0 ; $i < scalar(@tabIP) ; $i++)

  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
    Bonjour,

    Visiblement tu sors en timed out
    Il est bizarre que le warn ne laisse pas passer à l'itération suivante...

    Dans ce cas essaye plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    my $login = $ssh->login();
            if ($login !~ /Welcome/) {
                print "Login has failed. Login output was $login";
                next; ## Bref ce permet de passer à l'itération suivante => @IP suivante dans le tableau...
            }

  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
    La fonction login ne marche pas avec le module net::openSSH. Dans le même esprit, je vais essayer de récupérer la variable $ssh et de traiter l'information.

    En m'aidant de ce que tu as dis dmganges, j'en suis venu à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    my $err = $ssh->{_error};
    print $err."\n";
    if ($err eq 'unable to establish master SSH connection: login timeout') {
      print "Login has failed. Login output was $err";
      next; ## Next permet de passer à l'itération suivante => @IP suivante dans le tableau...
    }
    Je suis entrain d'effectuer les tests mais ça me semble concluant !

    Edit : Après les tests, ça fonctionne. J'arrive bien à passer de la machine qui marche pas à celle où j'arrive à me connecter dessus et les informations sont bien récupérées !

    Merci !!

  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
    Oui c'est le principe...

    Mais comme tu n'as pas donné la boucle complète...
    j'étais resté avec ce qu'on avait fait il y a des lustres

    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
    #!/usr/bin/perl --
    use DBI;
    use POSIX qw(strftime mktime);
    use POSIX qw(strftime mktime);
    use Getopt::Std;
    use strict;
    use warnings;
    use Data::Dumper;
    use Net::OpenSSH;
    use Net::SSH::Expect;
    #$Net::OpenSSH::debug |= 16;
     
    #################
    ### Variables ###
    #################
    my $chunk;
     
    ##################################################
    ###   Ouverture du fichier de conf à remplir   ###
    ##################################################
     
    open( my $FILE,'>:utf8',"config_p.txt") or die ("Erreur d'ouverture du fichier\n");
     
    #########################
    ###   Connexion SSH   ###
    #########################
    my $host = '192.168.1.12';
    my $user = 'xxxxx';
    my $password = 'xxxxxx';
     
    print "==> Connexion SSH en cours...\n";
     
    my %param=(
        user => $user,
        password=> $password,
        timeout => 30,
        port => '22'
        );
    #my $ssh = Net::OpenSSH->new($host,%param);
     
    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));
    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;
    Bonne continuation

  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
    Essaye de regarder le module Net::SSH2.

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

Discussions similaires

  1. communication ssh sur plusieurs machine impossible
    Par kirua99 dans le forum Réseau
    Réponses: 2
    Dernier message: 26/01/2015, 16h26
  2. Connexion SSH machine hôte -> Virtualbox
    Par Guigui13 dans le forum VirtualBox
    Réponses: 14
    Dernier message: 29/08/2013, 01h58
  3. Réponses: 2
    Dernier message: 08/09/2011, 11h17
  4. connexion de plusieurs serveurs
    Par kheiro dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/10/2004, 11h49
  5. [Débutant] Connexion sur une machine distante protégée
    Par arthix dans le forum Développement
    Réponses: 3
    Dernier message: 28/08/2003, 09h46

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