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 :

module Net::SSH2 curiosité exécution commande ssh ?


Sujet :

Modules Perl

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 75
    Points : 42
    Points
    42
    Par défaut module Net::SSH2 curiosité exécution commande ssh ?
    Bonjour à tous

    j'utilise le module : Net::SSH2 afin de de me connecter et exécuter des commandes sur serveur.

    Ce que je ne comprend pas c'est que si je mets pas un "sleep 2" par exemple après la commande il ferme le tunnel avant d'avoir réllement exécuter la commande sans attendre le retour.

    Je souhaiterai donc avoir vos avis !

    voic un extrait de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    my $chantest = $ssh2_test->channel();
     
    	$chantest->exec('/etc/init.d/smbd stop');
     
             sleep 2;#si je l'enlève le ne fait rien
     
    $chantest->close();
    j'utilise se module car il me permet de me connecter avec des clefs ssh directement

    Je vous remercie

  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,
    je n'utilise pas ce module, mais la doc fait état d'un timeout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    timeout ( timeout_ms )
    Enables a global timeout (in milliseconds) which will affect every action.
    
    libssh2 version 1.2.9 or higher is required to use this method.
    As-tu essayé ?

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 75
    Points : 42
    Points
    42
    Par défaut
    Je vais tenter avec ce paramètre et je vous ferai signe.

    Se qui m'embête un peut concrètement avec le timeout si je comprends bien c'est un temps prédéfinit?

    Car si j'envoie un "cp" d'un gros fichier par exemple et que le timeout est trop court ça risque de me couper la commande avant.. je suppose.

    Je n'ai pas tous les éléments, mais je teste ça lundi.

    Je reste surpris que le programme n'attends pas tous simplement qu'on lui rende la main pour fermer la connexion ssh.(mais je reste un débutant !)

    je vous remercie

  4. #4
    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 l'impression que j'ai eu aussi :
    "Enables a global timeout"

    Ça me semble s'appliquer depuis le début de la connexion jusqu'à la déconnexion
    Bon test

  5. #5
    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
    Voici ce que dit la documentation de la bibliothèque libssh2 sous-jacente:

    Set the timeout in milliseconds for how long a blocking the libssh2 function calls may wait until they consider the situation an error and return LIBSSH2_ERROR_TIMEOUT.

    By default or if you set the timeout to zero, libssh2 has no timeout for blocking functions.
    Autrement dit, si on met ce paramètre à 0, il n'y aura pas de timeout.

    Mais si un appel qui ne devrait prendre normalement que moins d'une seconde s'éternise, il peut y avoir de bonnes raisons de l'arrêter au bout de, par exemple, 20 ou 30 secondes, afin soit de le relancer, soit de vérifier quelque chose d'autre avant de le relancer. De même que quand on surfe sur le Web, parfois quand une page ne vient pas, on a intérêt à essaier de la redemander plutôt que d'attendre sans fin une réponse peut-être définitivement perdue quelque part dans les sables mouvants du WWW.

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 75
    Points : 42
    Points
    42
    Par défaut
    Bonjour,

    Effectivement vu sous cette angle ça peut être utile. Par contre comment fait on dans ce cas lorsqu'on à une commande à exécuter dont le temps peut être très variable.

    comme la copie d'un fichier qui diffère selon la taille. Ça me parait plus compliqué de prévoir le temps d’exécution.

    L'idéal serait effectivement que le programme rende la main après l'exécution.

    Concernant le timeout je ne sais pas trop quand le placer est-ce au moment de la construction de l'objet ?
    ex ssh2->new(timeout ( timeout_ms ))


    J'avoue que j'ai un peu de mal encore avec l'utilisation des modules.

    je vous remercie

  7. #7
    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
    Franchement, je fais parfois du ssh en shell pour des commandes très simples (du genre, généralement, lancer en tâche de fond un programme non-bloquant installé sur l'autre bécane, puis me mettre en sommeil et aller voir de temps en temps s'il s'est terminé afin de récupérer les données produites quand c'est fini), mais je n'utilise pas ce module Perl.

    Mais j'imagine que pour des commandes courantes de durée relativement stable, de type ls, cd, echo, mkdir, date, chmod, head, rm, touch, etc., tu peux fixer un time out assez bas, afin d'éviter qu'une commande bloquante ne gèle indéfiniment ton programme. Pour des commandes dont la durée d'exécution varie et dépend de la taille d'un fichier (sort, cp, ftp, sftp, rcp, grep, wc, etc.), tu peux sans doute commencer par récupérer la taille du fichier à traiter et essayer d'adapter le time out de façon empirique à cette taille. Ou alors, tu lances le vrai travail en tâche de fond, et dans ce cas tu n'es bloqué que pendant le temps de lancer le processus fils.

  8. #8
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Peut-être que la méthode wait_closed() est celle que tu devrais utiliser ?

    EDIT : Apparemment la méthode habituelle est simplement de lire sur le canal, on reçoit un eof lorsque la commande est finie. Pour quelques exemple d'utilisation du module, j'ai trouvé cette page : http://www.perlmonks.org/?node_id=569657
    --
    Jedaï

  9. #9
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 75
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Franchement, je fais parfois du ssh en shell pour des commandes très simples (du genre, généralement, lancer en tâche de fond un programme non-bloquant installé sur l'autre bécane, puis me mettre en sommeil et aller voir de temps en temps s'il s'est terminé afin de récupérer les données produites quand c'est fini), mais je n'utilise pas ce module Perl.

    Mais j'imagine que pour des commandes courantes de durée relativement stable, de type ls, cd, echo, mkdir, date, chmod, head, rm, touch, etc., tu peux fixer un time out assez bas, afin d'éviter qu'une commande bloquante ne gèle indéfiniment ton programme. Pour des commandes dont la durée d'exécution varie et dépend de la taille d'un fichier (sort, cp, ftp, sftp, rcp, grep, wc, etc.), tu peux sans doute commencer par récupérer la taille du fichier à traiter et essayer d'adapter le time out de façon empirique à cette taille. Ou alors, tu lances le vrai travail en tâche de fond, et dans ce cas tu n'es bloqué que pendant le temps de lancer le processus fils.

    Bonjour,

    Effectivement j'avais pensé à cette solution.
    Mais lorsque je tente de lancer cette commande en tache de fond (à l'aide d'un '&'), il s'exécute de la même façon.

    je dois mal m'y prendre.

    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #$chan->exec("/etc/init.d/smbd restart &");
    je te remercie

  10. #10
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 75
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par Jedai Voir le message
    Peut-être que la méthode wait_closed() est celle que tu devrais utiliser ?

    EDIT : Apparemment la méthode habituelle est simplement de lire sur le canal, on reçoit un eof lorsque la commande est finie. Pour quelques exemple d'utilisation du module, j'ai trouvé cette page : http://www.perlmonks.org/?node_id=569657
    --
    Jedaï
    Bonjour dejaï,

    Ta solution à l'air inintéressante ce que je ne maîtrise pas c'est l'utilisation.
    J'ai parcouru l'exemple dont tu parles, je ne trouve pas de wait_closed().

    je trouve ce type de chose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #après avoir lancé des commandes
    $chan->send_eof();#là je suppose qui lance un eof mais cela ne va t il pas couper la commande justement?
    $chan->close;
     
    #je vois également une commande du type:
    $chan3->blocking(1);
    #ou
    $chan3->blocking(0);#serait-ce pour libérer le channel pour lancer une commande suivante?
    merci pour vos réponse

    Cordialement

  11. #11
    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
    Citation Envoyé par tintin3158 Voir le message
    Bonjour,

    Effectivement j'avais pensé à cette solution.
    Mais lorsque je tente de lancer cette commande en tache de fond (à l'aide d'un '&'), il s'exécute de la même façon.

    je dois mal m'y prendre.

    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #$chan->exec("/etc/init.d/smbd restart &");
    Au pire, tu mets la commande "/etc/init.d/smbd restart &" dans un shell et tu lances le shell.

    A essayer aussi: "nohup /etc/init.d/smbd restart &"

  12. #12
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    La discussion sur Perlmonks propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #my $chan = $ssh2->channel();
    #$chan->blocking(0);
    #$chan->exec('ls -la');
    #while (<$chan>){ print } 
     
    # to run a remote command in the background
    # you need to semi-daemonize it by redirecting it's filehandles
    my $chan3 = $ssh2->channel();
    $chan3->blocking(1);
    $chan3->exec("nohup /home/zentara/perlplay/net/zzsleep > foo.out 2> fo
    +o.err < /dev/null &");
    $chan3->send_eof;
    A priori le premier exemple (commenté) est ce qu'il faut faire si la sortie de la commande t'importe, tandis que le deuxième exemple correspond plus à ton cas d'une commande dans l'arrière-plan (mais le programme n'attendra probablement pas qu'elle s'achève donc le premier exemple est peut-être plus adapté si c'est ce que tu souhaites).

    --
    Jedaï

  13. #13
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 75
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Au pire, tu mets la commande "/etc/init.d/smbd restart &" dans un shell et tu lances le shell.

    A essayer aussi: "nohup /etc/init.d/smbd restart &"
    merci lolo pour ta suggestion, je viens de tester malheureusement ça ne fonctionne pas .

  14. #14
    Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 75
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par Jedai Voir le message
    La discussion sur Perlmonks propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #my $chan = $ssh2->channel();
    #$chan->blocking(0);
    #$chan->exec('ls -la');
    #while (<$chan>){ print } 
     
    # to run a remote command in the background
    # you need to semi-daemonize it by redirecting it's filehandles
    my $chan3 = $ssh2->channel();
    $chan3->blocking(1);
    $chan3->exec("nohup /home/zentara/perlplay/net/zzsleep > foo.out 2> fo
    +o.err < /dev/null &");
    $chan3->send_eof;
    A priori le premier exemple (commenté) est ce qu'il faut faire si la sortie de la commande t'importe, tandis que le deuxième exemple correspond plus à ton cas d'une commande dans l'arrière-plan (mais le programme n'attendra probablement pas qu'elle s'achève donc le premier exemple est peut-être plus adapté si c'est ce que tu souhaites).

    --
    Jedaï
    Bonjour jedaï,

    un grand merci, la fonction proposé fonctionne parfaitement.

    petite question pour culture :
    $chan3->blocking(1); ou $chan3->blocking(0); à quoi cela sert-il ? différences?

    concernant la fin de votre code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    $chan3->exec("nohup /home/zentara/perlplay/net/zzsleep > foo.out 2> fo+o.err < /dev/null &");
     
    ################################
    # quelle est l'utilité de  : > foo.out 2> fo+o.err < /dev/null &
    #################################
     
    $chan3->send_eof;

    dans tous les cas merci beaucoup

Discussions similaires

  1. Module net::ftp, répéter une commande
    Par peuf23 dans le forum Modules
    Réponses: 2
    Dernier message: 08/01/2011, 22h27
  2. Exécuter commande SSH dans un script PHP.
    Par Greg05000 dans le forum Linux
    Réponses: 0
    Dernier message: 14/04/2010, 00h19
  3. Réponses: 6
    Dernier message: 04/11/2008, 09h51
  4. [SSH2] test d'exécution de commande ssh
    Par boriskov dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 29/07/2008, 19h46
  5. pb module NET::SSH::W32Perl
    Par ramislebob dans le forum Modules
    Réponses: 1
    Dernier message: 11/07/2006, 21h21

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