Bonjour,
je suis sous windows XP Pro
je voulais savoir si avec perl je pouvais lancer des scripts en shell unix sur un serveur distant.
Je veux savoir si c'est possible et si c'est le cas je me ferai un plaisir de rechercher moi-même.
Version imprimable
Bonjour,
je suis sous windows XP Pro
je voulais savoir si avec perl je pouvais lancer des scripts en shell unix sur un serveur distant.
Je veux savoir si c'est possible et si c'est le cas je me ferai un plaisir de rechercher moi-même.
Si ces scripts sont déjà sur ces serveurs, je te dirais donc que c'est possible.
Tu te connectes en ssh sur ces serveurs et lance les scripts.
Voilou
Oui les scripts sont déjà sur le serveur, je ne cherche qu'à les lancer.
Je vais rechercher ça et le dirai si je trouve comment faire.
Merci
Tu peux utiliser le module Net::SSH::Perl pour te connecter en ssh sur les serveurs.
Ensuite tu lances tes commandes.
voilou
Oui c'est ce que j'avais essayé de faire mais apparemment j'ai des problèmes car la fonction getpwuid n'a pas été implémentée
http://www.zotline.com/shownote.zot/NoteNum/3386.html
c'est bien ce qui me bloque.
je ne comprends pas ton probleme.
Le lien que tu donnes parles de perl 5.0 (tres tres vieux perl, plus d'actualités).
une fois connecté en ssh, je ne vois pas ce que t'arrive pas à faire!!
non le truc c'est que je ne peux pas me connecter en ssh car ce message d'erreur m'est retourné
"The getpwuid function is unimplemented at C:/Perl/site/lib/Net/SSH/Perl.pm line 110" lorsque je lance mon script dans l'invité de commande
j'avais installé activeperl 5.8.8
Ok, moi je l'utilise sous linux.
Je me demande s'il te faut pas installer cygwin, puis ssh pour pouvoir le tester
merci, je vais y réfléchir.
au final, je sais pas.
Je viens de tester sur un PC windows sur lequel ssh est installé via cygwin mais ça ne fonctionne pas
Regarde aussi Net::ssh2
C'est bon, j'ai pu me connecter en SSH sous windows sur un serveur linux.
Quand j'aurai terminé ce que j'ai à faire, j'expliquerai comment.
Ok, peut tu me mettre ton bout de code de test?
Quel module as tu utiliser?
sinon de windows à linux, j'y arrive aussi via net::ssh2, mais c pour qu'on puis comparer nos codes et le donner aux autres forumeurs
j'ai installé les modules
Math-BigInt
Math-BigInt-GMP
Math-Pari
en plus de Net::SSH et de Net::SSH::W32Perl
et j'ai supprimé "|| (getpwuid($>))[7]" à la ligne 110 dans le fichier c:/Perl/site/lib/net/SSH/Perl.pm
pour le code, c'est la syntaxe standard de création de l'objet.
EDIT: bon j'ai testé, c'est bon, je peux créer des répertoires, supprimer des fichiers,etcCode:
1
2
3
4
5
6 my $host = "XXXX"; my $user = "YYYY"; my $psswd = "ZZZZ"; my $ssh = Net::SSH::W32Perl->new( $host ); $ssh->login( $user , $psswd );
mais j'arrive pas à lancer un script XD
Ok, en gros, c'est du bourrin ton truc.
Il y a une façon plus propre de faire tout ça, je me mettrais dessus demain.
Car y a pas besoin de supprimer le code :mrgreen:
Purée ya un truc que je comprends pas.
Il me faut un package particulier ou une commande particulière pour pouvoir faire du "->cmd('/X/Y/Z.sh');" ????? c'est juste un shell à lancer mais ça fonctionne pas !!!
Bon, moi je te conseil de ne pas utiliser ce module :mrgreen:,
mais d'utiliser Net::SSH2.
1- Ce n'est pas bon de modifier le module comme tu l'as fait
2- C'est ensuite le bordel. et il date de 2002
3- Net::SSH::Perl fonctionne mieux sous linux
4- J'ai testé tous ces modules et au final j'arrive à faire ce que je veux sous windows (vers linux) avec Net::SSH2 et sous linux j'utilise Net::SSH::Perl
Donc Désinstalle le et install Net::SSH2. Garde ton code de Net::SSH::W32Perl de coté (on sait jamais) et je t'aiderais sur le ssh2, ok?
OK je vais faire un autre script en suivant tes instructions.
Je dirai si j'ai un problème. Merci
Je me suis pris la tête sur ce module, donc pour t'éviter de perdre du temps, je vais te donner une procédure que j'ai écrite qui fonctionne bien (car la doc du module à l'air simple mais le module a l'air capricieux).ça te convient :mrgreen:?
Principe de parcimonie (moindre effort) oblige, je serai vraiment bête de refuser une telle proposition :mrgreen:
merci:yaisse2:
Bon, je suis de bonne humeur, alors profite en :aie: :mrgreen:.
La procédure que j'ai crée permet de faire un ssh de windows sur un serveur (linux car c'est le test que moi j'ai effectué), ça se trouve, il fonctionnera bien de windows à windows, pas testé.
On lui donne en argument la référence d'un hash dans lequel on lui donne le nécessaire pour se connecter.
Dans ce hash, on peut lui mettre l'ensemble des commandes qu'on souhaite exécuter sur le serveur dans un tableau anonyme.
Et on le lance. Pour récupérer la sortie standard, faudra mettre verbose à 1 dans le hash, sinon il exécute les commandes mais ne récupère pas la sortie standard (le STDOUT).
Le seul hic, et tu pourras peut être chercher pour moi, c'est qu'en cas de mauvaises connexion ou mauvais login, host, etc, le module ne me prévient pas et ne fait rien (ce qui est dommage), j'attends donc ta solution (faut quand même bosser un peu ;))
Voilà le code exemple :
Pour les détails, voir les cours et tutoriels de formation pour apprendre la programmation Perl : http://perl.developpez.com/cours/Code:
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 #!/usr/bin/perl use strict; use warnings; my ($host, $login, $password) = ("SERVEUR", "root", "PASSWD"); my %InfoSSH = ( host => $host, login => $login, password => $password, cmd => ["cat /etc/passwd", "pwd", "ls -alh", # "/var/www/test/test.sh", "mkdir -p toto", ], verbose => 1, # To get the stdout ); print CommandSSH( \%InfoSSH ); #================================================================== # But : Connection SSH + commandes # Args : # Retourne : rien ou le stdout # Besoin : modules Net::SSH2 sous win # Net::SSH::Perl sous linux #================================================================= sub CommandSSH { my ( $RefDataConnection ) = @_; # parameters my ($host, $login, $password, $Refcmd, $verbose) = ( $RefDataConnection->{host}, $RefDataConnection->{login}, $RefDataConnection->{password}, $RefDataConnection->{cmd}, $RefDataConnection->{verbose}, ); my $OS = $^O; my $STDOUT; # Linux if ( $OS eq "linux" ) { # A faire } # Windows elsif ( $OS =~ /^mswin32$/i ) { require Net::SSH2; my $ssh2 = Net::SSH2->new(); $ssh2->connect($host) or die "Unable to connect to $host, $! $@ \n"; $ssh2->auth_password($login, $password) or die "Unable to login $! \n"; foreach my $cmd ( @{$Refcmd} ) { my $channel = $ssh2->channel(); $channel->blocking(1); $channel->exec($cmd); while( $channel->read(my $buffer, 1024) ) { if ( defined $verbose and $verbose == 1 ) { $STDOUT .= $buffer; } } $channel->close; } } if (defined $verbose) { return $STDOUT; } return; }
Ok merci je vais regarder ça !!!
j'étais en train d'utiliser le module Net::SSH2
Salut, j'ai testé ton programme et je me connecte bien en ssh au serveur désiré.
L'inconvénient c'est que de la même façon qu'en utilisant le module Net::SSH2 je peux faire des chmod, mkdir, etc à la c... mais je n'arrive tout bonnement pas à lancer un .sh ou un .pl, ça me rend fou car je ne comprend pas pourquoi.
C'est idiot car il n'y a que ça qui me bloque. En tout cas merci d'avoir passé du temps à écrire ton script, mais à résultat égal je préfère utiliser le module Net::SSH2 comme tu le préconisais au début. J'espère que tu comprends !!!
question bete pour lancer ton .pl as tu essayer de faire un "perl /path/script.pl" ?
et si non quel commande as-tu tapé ?
je fais tout bêtement :
je précise que je n'ai rien dans l'erreur standard, simplement que le script ne s'est pas exécuté, car dans script.pl je supprime un fichier .txt afin de voir rapidement si le script a bien été exécuté or ce dernier n'est pas supprimé.Citation:
my $chan = $ssh2->channel();
my $program = 'perl /path/script.pl';
$chan->exec( $program ) or print STDERR "Impossible de lancer $program\n";
C'est peut-être idiot mais est-ce que j'ai à modifier la variable $ENV{PATH} si j'exécute des scripts sur un autre serveur ?
Je ne vois pas d'où vient ton problème car avec le script que je t'ai envoyé, j'exécute bien des scripts perl, sh ou autre à distant
Lorsque j'exécute ton script j'obtiens les sorties standards de mon .pl mais pas de mon .sh, pourtant les rm de mes scripts ne s'exécutent pas.
mais je présume que lorsque tu écris :
Net::SSH::.Perl sous linux me permet d'interpréter les commandes de mon script perl sous windows ?!Citation:
# Besoin : modules Net::SSH2 sous win
# Net::SSH::.Perl sous linux
pourtant les chmod et co. fonctionnent très bien !!!
ça vient peut-être du serveur sur lequel je veux bosser.
non, rien à voir, j'ai mis ce commentaire car je voulais que ma procédure puisse être utilisée sous linux, et pour cela, rajouter du code, ce qui est pas encore le cas pour l'instant
Comment lance tu ton script sh? est il executable?
ah ok
mon script .sh, je le lance comme ça en utilisant Net::SSH2:
tout bêtementCitation:
my $chan = $ssh2->channel();
my $program = '/path/script.sh';
$chan->exec( $program ) or print STDERR "Impossible de lancer $program\n";
et dans ton script je fais juste
en ayant pris soin de modifier host, login, etc.Citation:
...
cmd => [ '/path/script.sh'
],
...
bah bizarre car moi j'ai pas de souci sur un script sh
test.sh
Code:
1
2
3
4
5 #!/bin/sh echo "test " echo "" echo "bonjour"
Super ça marche !!!!
en fait ça vient de mes scripts sur le serveur, il faut que je précise les chemins d'accès absolu des fichiers que je dois traiter alors qu'ils étaient traités en local dans le repertoire courant !!!! c'était tout bête en fait
ouf je suis soulagé, je vais testé sur les connexions SSH avec le module Net::SSH2 mais j'ai déjà ton script qui marche !!!
je considère que c'est résolu, merci djibrill
Voilà avec le module Net::SSH2 ça fonctionne aussi impeccablement, je vais donc l'utiliser et essayer d'améliorer tout ça.
Moralité : mettre dans les scripts uniquement des chemins absolu pour éviter les pépins :mrgreen: :yaisse2:
c'est bien'o.
Oublie pas de mettre ton thread en résolu
Bonjour,
Je me permets de remonter le sujet car il correspond à un de mes besoins de me connecter en SSH à un Switch Cisco Catalyst.
Le code que tu as mis djibril semble fonctionner, mais il me fait une erreur :
Ceci vient de ce bout de code :Citation:
Can't call method "blocking" on an undefined value at test8.pl line 46
Il se trouve qu'il n'accepte pas qu'on ouvre et ferme un channel dans la boucle foreach. Lorsque je sors le $ssh2->channel (avant) et $channel->close (après), le script marche bien, mais je ne peux lancer qu'une commande vu qu'il n'y a qu'un seul channel d'ouvert.Code:
1
2
3
4
5
6
7
8
9
10
11 foreach my $cmd ( @{$Refcmd} ) { my $channel = $ssh2->channel(); $channel->blocking(1); $channel->exec($cmd); while( $channel->read(my $buffer, 1024) ) { if ( defined $verbose and $verbose == 1 ) { $STDOUT .= $buffer; } } $channel->close; }
Une idée par rapport à ce problème?
J'ai essayé de déclarer $channel avant la boucle, puis d'ouvrir le channel dans la boucle mais ça fait la même chose.
Merci d'avance pour votre aide !
Normalement, non. T'as essayé simple avec un ls -la par exemple ?
Et tente avec le debug, ça donne des idées.