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

  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 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 averti
    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
    Points : 411
    Points
    411
    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 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
    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 averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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
    Points : 406
    Points
    406
    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 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
    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
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Essaie de mettre ta commande dans une variable et de passer cette variable à capture.

  7. #7
    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
    Toujours la même erreur en passant par une variable, (le chemin est bon, j'ai copié/collé depuis la remote pour éviter ce genre de problème) :
    find: `/config/log': No such file or directory

  8. #8
    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
    Hum, et en lançant explicitement un shell, par exemple en passant la commande "sh /chemin/xxxx/xxxx/check.sh" (sh, ou ksh, ou bash, selon ce que tu utilises)? Si cat marche, ça devrait aussi marcher, je pense...

  9. #9
    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
    Ça ne marche pas non plus .

    Cat marche car c'est une commande interne au shell. Lorsque l'on est connecté en SSH, c'est comme si on était en local pour la durée de la connexion non ? Si la commande marche en local pourquoi elle ne marche pas via la capture ?!

    Est ce qu'il y aurait un autre moyen de récupérer les informations du-dit script par exemple en redirigeant le résultat dans un fichier puis de le recopier dans le premier fichier ?

  10. #10
    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
    La question est de savoir si le script se lance. S'il ne se lance pas, pourquoi? S'il se lance, alors pourquoi tu ne récupères pas sa sortie. Est-ce que le script écrit bien sur STDOUT? S'il écrit sur STDERR, peut-être que capture ne le récupère pas.

    Tu devrais commencer par utiliser un script qui se contente de créer un fichier en local (même vide). Tu lances ta commande ssh et tu pourras ensuite regarder si le fichier est créé. Cela te permettra de savoir si le script se lance ou non. On aura déjà progressé dans le diagnostic.

  11. #11
    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
    Mon script principal (celui qui se connecte en ssh et qui lance des commandes) se lance, il n'y a pas de problèmes.

    J'arrive à créer un fichier sur la machine locale (mon pc) et sur la remote (la machine sur laquelle je me connecte en SSH). De plus, j'arrive aussi à envoyer des commandes et récupérer le résultat via $ssh->capture. Ce résultat est déposé dans le fichier qui est situé sur la machine locale.

    Pour ce qui est du check.sh, quand je suis en local (càd sur la remote) et que je lance le script (check.sh), il s'exécute parfaitement et renvoie les bonnes données.

  12. #12
    Membre averti
    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
    Points : 411
    Points
    411
    Par défaut
    Salut ciols,

    Essaye ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    my $output = $ssh->capture({ stderr_to_stdout => 1 },
                                 "/chemin/xxxx/xxxx/check.sh");
    $ssh->error and
          warn "operation didn't complete successfully: ". $ssh->error;
    print $output;
    Si ton script check.sh (que l'on ne connaît pas du tout.. peux-tu le copier ici ?) ne gère pas correctement le contrôle d'erreurs, tu auras peut-être un peu plus d'infos.

    Tu ne précises pas si l'utilisateur ssh qui se connecte est le même que l'utilisateur avec lequel tu testes en local. S'il est différent, les permissions et l'environnement (PATH et autres variables) peuvent être différents pour lui, ou peut-être même le shell est différent. Cela fait beaucoup de choses qui peuvent faire que ton script ne s'exécute pas de la même façon.

    Tes déboires me rappellent les mésaventures courantes lorsqu'on met au point un script shell, qui "marche bien", et qu'on le met en crontab où il ne "marche plus", et où, pour éviter ces mésaventures, il est préférable : de lancer le script avec le même utilisateur et de faire en sorte que toutes les commandes shell lancées par le script soient préfixées de leur chemin absolu complet, au lieu de présumer que l'environnement saura les retrouver.


    Eks

  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
    Tout d'abord désolé pour le temps de réponse dû à l'alternance et merci de l’intérêt que tu portes à mon problème !

    L'utilisateur qui se connecte n'est pas le même qu'en local. Cependant, les permissions sont bonnes sur le script (755). Pour l'exécution du script j'ai bien fais attention de mettre le chemin absolu, celui qui est dans la variable PATH afin de ne pas avoir de problèmes.

    Je pense que le problème se situe dans le script car lors de l'exécution du script père, j'ai ça comme affichage :
    find : `/config/log' : No such file or directory
    La commande find est exécutée dans le script ci-dessous :

    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
    #!/usr/bin/env bash
     
    # Echo the running status of all the FusionWorks processes that have .pid files
     
    FILELIST=`find $FUSIONWORKS_HOME/config/log -name "*.pid" -print`
    for PIDFILE in $FILELIST
    do
            if test ! -f $PIDFILE ; then
                    echo $PIDFILE process not running
            fi
     
            lastRunning=0;
            lastNotRunning=0;
     
            PID=`cat $PIDFILE`
     
            for l_pid in $PID
            do
                if ps -p $l_pid >/dev/null 2>&1; then
                    lastRunning=$l_pid
                    echo $lastRunning >>$PIDFILE.tmp
                else
                    lastNotRunning=$l_pid;
                fi
            done
     
            if [ $lastRunning -gt 0 ]
            then
                echo $PIDFILE process $lastRunning is running
                # Only update the PID file if we own it
                if [ `ls -l $PIDFILE | awk '{print $3}'` == $USER ]; then
                    mv $PIDFILE.tmp $PIDFILE
                else
                    rm $PIDFILE.tmp
                fi
            else
                if [ $lastNotRunning -gt 0 ]
                then
                    echo $PIDFILE process $lastNotRunning is not running;
                fi
            fi
    done

  14. #14
    Membre averti
    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
    Points : 411
    Points
    411
    Par défaut
    Citation Envoyé par ciols Voir le message
    Tout d'abord désolé pour le temps de réponse dû à l'alternance et merci de l’intérêt que tu portes à mon problème !

    L'utilisateur qui se connecte n'est pas le même qu'en local. Cependant, les permissions sont bonnes sur le script (755). Pour l'exécution du script j'ai bien fais attention de mettre le chemin absolu, celui qui est dans la variable PATH afin de ne pas avoir de problèmes.

    Je pense que le problème se situe dans le script car lors de l'exécution du script père, j'ai ça comme affichage :


    La commande find est exécutée dans le script ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/usr/bin/env bash
     
    # Echo the running status of all the FusionWorks processes that have .pid files
     
    FILELIST=`find $FUSIONWORKS_HOME/config/log -name "*.pid" -print`
    (...)
    Le message d'erreur "find : `/config/log' : No such file or directory" semble bien être renvoyé par find (qui est donc correctement trouvée dans le path par le script lors de son exécution), par contre, manifestement, la variable d'environnement $FUSIONWORKS_HOME est vide, et find tente de lancer sa recherche dans le répertoire "/config/log", qui n'existe pas sur le système, ce qui semble provoquer l'erreur que tu as.

    Soit tu mets cette information en dur dans ton script shell, soit tu sources dans ton script shell le fichier de configuration qui définit cette variable d'environnement (car il y a des chances que cela ne soit pas la seule qui manque...).

    Par exemple, en admettant que les variables $FUSIONWORKS soient définies dans /home/ciols/.bashrc tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/usr/bin/env bash
     
    # source the correct environment settings
     
    . /home/ciols/.bashrc
     
    # Echo the running status of all the FusionWorks processes that have .pid files
     
    FILELIST=`find $FUSIONWORKS_HOME/config/log -name "*.pid" -print`
    (...)
    Le fait de précéder le nom du fichier de configuration d'un point va exécuter le contenu du fichier dans le processus bash de ton script (sans créer de processus séparé) et altérer l'environnement d'exécution selon le contenu de ce .bashrc (pourvu que tu aies des droits de lecture dessus).

    Vois ce qu'il y a dans le .bashrc pour t'assurer de ce que tu fais.


    Eks

  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
    Exactement. Le seul souci, c'est que je n'ai aucune idée de comment régler ce problème sachant que je ne peux ni modifier l'archi propre à la remote, ni modifier le remote script car il tourne sur toutes les machines que je dois checker.

    Une idée quelconque ?

    Merci encore

  16. #16
    Membre averti
    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
    Points : 411
    Points
    411
    Par défaut
    J'ai complété ma réponse ci-dessus après que tu aies répondu. Assures toi d'avoir bien tout lu.

    Ta question n'a rien à voir avec Perl, ni avec le module Net::OpenSSH.

    Si tu veux utiliser un même script shell reposant sur l'usage d'une variable globale sur une multitude de machines, tu dois t'assurer que la variable existe dans l'environnement d'exécution.

    Si elle n'existe pas dans l'environnement d'exécution et que le chemin de $FUSIONWORKS_HOME peut être différent d'une machine à l'autre, tu dois aller chercher l'information là où elle se trouve sur la machine concernée, par exemple en sourçant le fichier de configuration qui la définit comme proposé à la fin de mon message précédent.

    Ou alors tu exécutes ton script sous l'utilisateur qui est sensé utiliser cet environnement sur chaque machine, et tu disposeras de $FUSIONWORKS_HOME.

    Edit: j'ai parcouru rapidement ton script shell. Quand je vois cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                # Only update the PID file if we own it
                if [ `ls -l $PIDFILE | awk '{print $3}'` == $USER ]; then
                    mv $PIDFILE.tmp $PIDFILE
                else
                    rm $PIDFILE.tmp
                fi
    hormis le problème de variable d'environnement, il parait évident que l'utilisateur sous lequel est lancé le script conditionne son fonctionnement tel que l'a conçu son programmeur.


    Eks

  17. #17
    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

    La variable était déclarée dans le fichier .profile. Comme tu me l'a conseillé, j'ai ajouté cette ligne :
    . ./profile
    Et hop, ça marche

    J'aurais une autre question qui risque d'être plus rapide. J'ai besoin d'exécuter un autre script, sauf que celui-ci, est interactif. Est-il possible d'interagir avec lui après l'avoir lancé (cad rentrer des valeurs par exemple).

    Je suis d'accord de dire que c'est bizarre sachant que le ssh prône la sécurité et donc pas de saisie au clavier.

    Merci beaucoup !

  18. #18
    Membre averti
    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
    Points : 411
    Points
    411
    Par défaut
    Citation Envoyé par ciols Voir le message
    (...)
    J'aurais une autre question qui risque d'être plus rapide. J'ai besoin d'exécuter un autre script, sauf que celui-ci, est interactif. Est-il possible d'interagir avec lui après l'avoir lancé (cad rentrer des valeurs par exemple).
    (...)
    Pour cela, on utilise des outils de type expect.

    Pour faire cela sur une machine distante à partir d'une session ssh et piloté par Perl, tu as un module Net::SSH::Expect.


    Eks

  19. #19
    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 beaucoup pour ton aide !

    Bonne journée

  20. #20
    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
    Non résolu finalement !

    Le expect me cause quelques problèmes !!

    J'ai installé et déclaré le package. Jusque là ça va !

    Vient mon problème. Je cherche à me connecter en root où je suis connecté en SSH (via un autre compte pour des raisons de sécurité).

    J'ai farfouillé sur le net et j'ai trouvé différentes choses comme $ssh->send, $ssh->waitfor... mais dès que j'utilise ces fonctions, il m'affiche ce message d'erreur.

    standard in must be a tty
    Can't locate object method "waitfor" via package "Net::OpenSSH" at ...
    Je pense avoir plus ou moins compris l'erreur, j'utilise deux packages différents, OpenSSH et SSH::Expect, sont-ils incompatibles ?

    Le bout de programme le concernant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ssh->system("su root");
    $ssh->waitfor('Password:');
    $ssh->send($passroot);
    Je continue mes recherches demain mais si vous avez des petites idées pour m'aiguiller ça serait parfait !

    Bonne fin de journée

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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