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 :

Connexion SSH et récupération de résultats de commandes


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 Connexion SSH et récupération de résultats de commandes
    Bonjour,

    Dans le cadre d'un mini-projet de vérification de configuration je dois développer un script qui, à terme, devra récupérer une conf d'un équipement et la comparer avec la conf de référence.

    Pour cela, je dois me connecter en SSH sur la-dite machine mais j'ai une erreur que je n'arrive pas à corriger. Voila 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
    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
    #!/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;
     
    ###################################################	
    #                                                 #
    #                   Variables                     #
    #                                                 #
    ###################################################
     
    my $ssh;
    my $host;
    my $user_name;
    my $password;
     
    my $dir;
     
    my @logInstalFiles = ("readme","readme2","readme3","readme4");
    my @logAppliFiles = ("readme","readme2","readme3","readme4");
     
     
    ###################################################	
    #                                                 #
    #                   Programme                     #
    #                                                 #
    ###################################################
     
    ##################################################
    ###   Ouverture du fichier de conf à remplir   ###
    ##################################################
     
    open(FILE,">config_p.txt") or die ("Erreur d'ouverture du fichier\n");
     
    #########################
    ###   Connexion SSH   ###
    #########################
     
    print "==> Connexion SSH en cours...\n";
     
    $host = "xxx.xxx.xxx.xxx";
    $user_name = "login";
    $password = "password";
     
    $ssh = Net::OpenSSH->new($host,user => $user_name, password => $password);
    $ssh->error and die "unable to connect to remote host : ". $ssh->error;
     
    print "Connexion OK\n";
     
     
    ##############################################
    ###   Vérification des logs installation   ###
    ##############################################
     
    print(FILE "01 - Vérification des logs installation\n\n");
    $ssh->system("grep * /chemin_vers_les_differents_fichiers/") or
    	die "remote command failed : " . $ssh->error;
     
    <STDIN>;
     
    print "\n";
     
    # Step 2
     
    $ssh->system("cd xxxxxxx/") or
    	die "remote command failed : " . $ssh->error;
     
    foreach my $fichier (@logInstallFiles)
    {
    	print(FILE "$fichier\n");
    	$ssh->system("grep * $fichier") or
    		die "remote command failed : " . $ssh->error;
    	print FILE join("",<RESULT>);
    }
     
     
     
    #####################################
    ###   Vérification des services   ###
    #####################################
     
    print(FILE "\n02 - Vérification des services\n\n");
     
    open(RESULT,"script.sh|") or die $!;
    print FILE join("",<RESULT>);
    Avec l'erreur suivante :

    ==> Connexion SSH en cours...
    Uncaught exception from user code:
    unable to connect to remote host : unable to create ctl_dir /users/xxxx/.libnet-openssh-perl at ./test_p.pl line 82.
    Merci d'avance pour l'aide apportée !

  2. #2
    Membre chevronné
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Par défaut
    Salut ciols,

    Je n'ai pas regardé ton code source.

    Selon le code source du module, l'erreur "unable to create ctl_dir" est renvoyée par cette partie du code du module Net::OpenSSH :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	my $old_umask = umask 077;
            mkdir $ctl_dir;
    	umask $old_umask;
            unless (-d $ctl_dir) {
                $self->_set_error(OSSH_MASTER_FAILED, "unable to create ctl_dir $ctl_dir");
                return $self;
            }
    Le script tente de créer le répertoire /users/xxxx/.libnet-openssh-perl et ensuite teste si ce répertoire existe.

    La raison pour laquelle le script n'est pas parvenu à créer ce répertoire est sans doutes plus facile à deviner par toi que par nous. Cela ressemble à un problème de permissions.


    Eks

  3. #3
    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
    Salut,

    Merci de ta réponse rapide ! En effet c'était bien une erreur de permission car j'ai essayer de le lancer avec le compte root et ça a marché.

    J'ai de nouveau un problème qui, cette fois, ne sera pas un problème de permissions... 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
     
    @output = $ssh->capture("grep * /chemin/.../Install_Fichier.log");
     
    foreach (@output)
    {
            print FILE "$_";
    }
     
    @output = ();
    print "appuyez sur un bouton\n";
    <STDIN>;
    // Jusque la tout va bien, le fichier Install_Fichier.log a bien été copié dans FILE
     
    # Step 2
     
    @log_Install_Files = $ssh->capture("ls /chemin/xxx/xxx/xxx/");
     
    foreach my $fichier (@log_Install_Files)
    {
            chomp($fichier);
            print "boucle 1 : $fichier\n";
            print FILE "\n**** $fichier ****\n\n";
     
            @output = $ssh->capture("grep * /chemin/xxx/xxx/xxx/$fichier") or die "erreur rencontrée : " . $ssh->error; // LIGNE 111
            # Le grep * pour récupérer toutes les informations dans les fichiers ne marche pas...
            foreach (@output)
            {
                    print "boucle deux\n";
                    print FILE "$_";
            }
    }
    Tout est bien déclaré, dans @log_Install_Files j'ai bien tous les fichiers que j'ai besoin mais à l’exécution du programme, j'ai cet affichage :

    boucle 1 : nom_du_fichier
    (le programme mouline mais n'avance pas du coup je fais un ctrl + C)
    erreur rencontrée : 0 at ./test.pl line 111, <STDIN> line 1.

    Une idée ? J'ai plus ou moins tout essayé mais rien n'y fait !

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Par défaut
    ta commande ne semble pas bonne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @output = $ssh->capture("grep * /chemin/xxx/xxx/xxx/$fichier") or die "erreur rencontrée : " . $ssh->error;
    si tu veux tout ce qu'il y a dans le fichier, essaie plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @output = $ssh->capture("cat /chemin/xxx/xxx/xxx/$fichier") or die "erreur rencontrée : " . $ssh->error;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @output = $ssh->capture("egrep '.*' /chemin/xxx/xxx/xxx/$fichier") or die "erreur rencontrée : " . $ssh->error;
    tu dis que ça n'avance pas mais quelle taille fait ton fichier? il met peut être du temps à tout charger

  5. #5
    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
    Avec cat c'est beaucoup mieux en effet. La taille du fichier n'est pas un problème, le script, en fonctionnement normal, met quelques secondes pour exécuter les commandes présentes.

    Ce problème est réglé.

    Dans la continuité, je veux exécuter un script (check.sh) sur la remote à l'aide des commandes SSH.

    J'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @output = $ssh->capture("/chemin/xxxx/xxxx/check.sh") or die "Impossible de récupérer les données du script : " . $ssh->error;
    Quelques informations :
    - Quand je suis sur la remote et que je lance le script, il fonctionne (check.sh), ce n'est donc pas un problème de droit
    - Erreurs affichées :
    bash: -c: line 1: syntax error: unexpected end of file
    Impossible de récupérer les données du script: child exited with code 1 at ./test.pl line 123, <STDIN> line 1. La ligne 123 étant celle au-dessus.
    En modifiant un peu la syntaxe de la commande sans le | par exemple j'ai cette erreur (qui est sensée) :
    bash: check.sh: command not found
    EDIT : Même avec le chemin absolu du script ça ne marche pas , alors qu'en local ça marche

    EDIT2 : La dernière erreur en date concerne un chemin dans le code du script exécuté
    find: `/config/log': No such file or directory

  6. #6
    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
    Billets dans le blog
    1
    Par défaut
    Essaie de mettre ta commande dans une variable et de passer cette variable à capture.

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

Discussions similaires

  1. [BATCH] lancer des commandes après une connexion ssh et smbclient
    Par floctc dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 16/06/2015, 18h05
  2. Réponses: 2
    Dernier message: 26/04/2011, 11h13
  3. raccourci ligne de commande pour connexion ssh ?
    Par byloute dans le forum Windows 7
    Réponses: 1
    Dernier message: 06/03/2011, 21h59
  4. Connexion SSH et commande en perl
    Par aoshi85 dans le forum Modules
    Réponses: 34
    Dernier message: 22/11/2008, 09h54
  5. Récupération du résultat d'une commande shell
    Par klu dans le forum Langage
    Réponses: 8
    Dernier message: 16/02/2006, 23h34

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