Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Module Net::SSH2

7 réponses
Avatar
Sébastien Cottalorda
Salut tout le monde,

je m'embrouille les pinceaux avec le module Net::SSH2

Je dois me connecter sur une machine distante (bien sûr...), sur un port
spécifique, avec un login et un mot de passe.
Jusque là, pas de problème.

J'ai un soucis avec l'exécution de commandes:
#==========================================================
#!/usr/bin/perl -w
use strict;
use Net::SSH2;

my $destination="127.0.0.1";
my $port=4444;
my $login="MyLogin";
my $password="MyPassword";
my $ssh2 = Net::SSH2->new();

unless ($ssh2->connect($destination, $port)){
print "Impossible de se connecter $!\n";
exit 1;
}

if ($ssh2->auth_password($login,$password)) {
my $chan = $ssh2->channel();
print "Lancement de LS\n";
$chan->exec('ls');
print $_ while (<$chan>);
print "Lancement de LS ... Terminé\n";
}
$ssh2->disconnect();
exit;
#=============================================================

J'obtiens:
Lancement de LS
Lancement de LS ... Terminé

et rien entre les 2.

Comment faire pour lancer une série de commandes quelconque et récupérer
chaque STDOUT, et éventuellement chaque STDERR.

Merci d'avance pour toutre aide.

Sébastien

7 réponses

Avatar
Sébastien Cottalorda
Salut tout le monde,

je m'embrouille les pinceaux avec le module Net::SSH2

Je dois me connecter sur une machine distante (bien sûr...), sur un port
spécifique, avec un login et un mot de passe.
Jusque là, pas de problème.

J'ai un soucis avec l'exécution de commandes:
#========================================================= > #!/usr/bin/perl -w
use strict;
use Net::SSH2;

my $destination="127.0.0.1";
my $portD44;
my $login="MyLogin";
my $password="MyPassword";
my $ssh2 = Net::SSH2->new();

unless ($ssh2->connect($destination, $port)){
print "Impossible de se connecter $!n";
exit 1;
}

if ($ssh2->auth_password($login,$password)) {
my $chan = $ssh2->channel();
print "Lancement de LSn";
$chan->exec('ls');
print $_ while (<$chan>);
print "Lancement de LS ... Terminén";
}
$ssh2->disconnect();
exit;
#============================================================ >
J'obtiens:
Lancement de LS
Lancement de LS ... Terminé

et rien entre les 2.

Comment faire pour lancer une série de commandes quelconque et récupérer
chaque STDOUT, et éventuellement chaque STDERR.

Merci d'avance pour toutre aide.

Sébastien
Finalement, j'ai utilisé Net::SSH::Perl qui fonctionne parfaitement.


Je pensais qu'il fallait que je m'oriente vers Net::SSH2 car je cite
l'auteur :
"The Net::SSH::Perl modules are showing signs of age; with the requirement
to be compatible with SSH versions 1 and 2, support of newer features such
as channels is difficult; it also has many dependencies, some of which
are hard to build (e.g. Math::Pari). (Net::SSH is just a wrapper around the
ssh binaries, and never should have got the namespace.) Net::SSH2 is a
new start, with few dependencies and all the functionality of the SSH
protocol, version 2, at your disposal."

Bref, pourquoi changer une équipe qui gagne.....
Sébastien

Avatar
Denis
Bonjour,

Au moins pendant le dev, il est souvent utile de passer par "use
strict" et "use warning" au début du script.

my $chan = $ssh2->channel();
print "Lancement de LSn";
$chan->exec('ls');
print $_ while (<$chan>);


Je cite la documentation :
""channel ( [type, [window size, [packet size]]] )
Creates and returns a new channel object.""

Je ne comprends pas pourquoi l'utiliser comme un file handle la doc de
l'objet ne le prévoit pas
(http://search.cpan.org/~dbrobins/Net-SSH2-0.08/lib/Net/SSH2/Channel.pm).


Comment faire pour lancer une série de commandes quelconque et récup érer
chaque STDOUT, et éventuellement chaque STDERR.


Le bon moyen a été trouvé je crois en passant par un module plus
simple :)

Bonne continuation,

--
Denis

Avatar
Paul Gaborit
À (at) 18 Sep 2006 06:17:21 -0700,
"Denis" écrivait (wrote):
Au moins pendant le dev, il est souvent utile de passer par "use
strict" et "use warning" au début du script.

my $chan = $ssh2->channel();
print "Lancement de LSn";
$chan->exec('ls');
print $_ while (<$chan>);


Je cite la documentation :
""channel ( [type, [window size, [packet size]]] )
Creates and returns a new channel object.""

Je ne comprends pas pourquoi l'utiliser comme un file handle la doc de
l'objet ne le prévoit pas
(http://search.cpan.org/~dbrobins/Net-SSH2-0.08/lib/Net/SSH2/Channel.pm).


Et pourtant si. Petit extrait de la doc :

A channel object is created by the Net::SSH2 channel method. As
well as being an object, it is also a *tied* *filehandle*...


Comment faire pour lancer une série de commandes quelconque et récupérer
chaque STDOUT, et éventuellement chaque STDERR.


Le bon moyen a été trouvé je crois en passant par un module plus
simple :)


...ou alors il fallait tester la méthode 'read' (avec le troisième
argument optionnel pour lire STDERR) ou la méthode 'poll' (celle de
Net::SSH2) pour vérifier la présence de données à lire.

On peut aussi utiliser 'ext_data' pour fusionner STDERR et STDOUT ou
tout simplement pour ignorer STDERR.

PS: ce qui m'étonne, c'est la possibilité *d'écrire* sur STDERR via
'write' (avec le deuxième argument optionnel)... Qui reçoit ce flux ?

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>


Avatar
Sébastien Cottalorda
À (at) 18 Sep 2006 06:17:21 -0700,
"Denis" écrivait (wrote):

Au moins pendant le dev, il est souvent utile de passer par "use
strict" et "use warning" au début du script.


my $chan = $ssh2->channel();
print "Lancement de LSn";
$chan->exec('ls');
print $_ while (<$chan>);


Je cite la documentation :
""channel ( [type, [window size, [packet size]]] )
Creates and returns a new channel object.""

Je ne comprends pas pourquoi l'utiliser comme un file handle la doc de
l'objet ne le prévoit pas
(http://search.cpan.org/~dbrobins/Net-SSH2-0.08/lib/Net/SSH2/Channel.pm).



Et pourtant si. Petit extrait de la doc :

A channel object is created by the Net::SSH2 channel method. As
well as being an object, it is also a *tied* *filehandle*...



C'est pourtant bien ce que j'avais compris, mais je pensais que
l'utilisation était plus simple : Je n'avais pas fait attention au poll
+ read.


Comment faire pour lancer une série de commandes quelconque et récupérer
chaque STDOUT, et éventuellement chaque STDERR.


Le bon moyen a été trouvé je crois en passant par un module plus
simple :)



...ou alors il fallait tester la méthode 'read' (avec le troisième
argument optionnel pour lire STDERR) ou la méthode 'poll' (celle de
Net::SSH2) pour vérifier la présence de données à lire.

On peut aussi utiliser 'ext_data' pour fusionner STDERR et STDOUT ou
tout simplement pour ignorer STDERR.

PS: ce qui m'étonne, c'est la possibilité *d'écrire* sur STDERR via
'write' (avec le deuxième argument optionnel)... Qui reçoit ce flux ?

OK, mais cela ressemble plus à une usine à gaz...

Les primitives sont vraiment primitives ..... :-)

Merci pour votre aide.



Avatar
Paul Gaborit
À (at) Tue, 19 Sep 2006 09:23:02 +0200,
Sébastien Cottalorda écrivait (wrote):
OK, mais cela ressemble plus à une usine à gaz...
Les primitives sont vraiment primitives ..... :-)


C'est ce qui permet de gérer finement les choses (plusieurs connexions
simultanées, gestion d'une interface en parallèle, etc.) sans passer
obligatoirement par du multiprocess ou du multithreads.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Sébastien Cottalorda
À (at) Tue, 19 Sep 2006 09:23:02 +0200,
Sébastien Cottalorda écrivait (wrote):

OK, mais cela ressemble plus à une usine à gaz...
Les primitives sont vraiment primitives ..... :-)



C'est ce qui permet de gérer finement les choses (plusieurs connexions
simultanées, gestion d'une interface en parallèle, etc.) sans passer
obligatoirement par du multiprocess ou du multithreads.

Je comprends bien, mais, pour un néophite, ces primitives peuvent être

difficiles à manipuler.

Il aurait été nettement plus judicieux,de proposer, en plus, des
"macros" permettant de gérer simplement ce que j'essayais de faire:
Envoi d'une commande
Réception du résultat sous forme de stderr,stdin et exit_code

comme le fait si bien Net::SSH::Perl gràce à la commande :
my($stdout, $stderr, $exitcode) = $ssh->cmd($commande_a_executer);


Avatar
Paul Gaborit
À (at) Tue, 19 Sep 2006 20:50:12 +0200,
Sébastien Cottalorda écrivait (wrote):
Il aurait été nettement plus judicieux,de proposer, en plus, des
"macros" permettant de gérer simplement ce que j'essayais de faire:
Envoi d'une commande
Réception du résultat sous forme de stderr,stdin et exit_code
comme le fait si bien Net::SSH::Perl gràce à la commande :
my($stdout, $stderr, $exitcode) = $ssh->cmd($commande_a_executer);


C'est vrai. Mais il faut être indulgent. Le module Net::SSH2 n'en est
qu'à la version 0.08 ! Et comme Net::SSH::Perl et Net::SSH2 ont le
même auteur, on peut en déduire qu'un jour, ils seront au même niveau
de fonctionnalités...

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>