Probleme de socket dans petit script sftp Perl

Probleme de socket dans petit script sftp Perl - Perl - Programmation

Marsh Posté le 03-04-2005 à 14:35:13    

Bonjour
J'ai concocte un petit script ne perl (je connaissait rien a perl mais c'est le seul outil me permettant de faire ce que je veux cad recuperer des fichiers sur un serveur distant via sftp).
Je veux encainer 2 connexions successives mais pour la deuxieme ca me fait une erreur:
Net::SSH: Can't bind socket to port 1023: Adresse déjà utilisée at /usr/lib/perl5/site_perl/5.8.0/Net/SFTP.pm line 36
comme si la premiere connexion etait toujours active.
en fait j'aimerais trouver comment fermer ma premiere connexion avant d ouvrir la 2eme mais je n'ai pas trouve de fonction pour
quelqu'un aurait peut etre une idee , voici mon code:

Code :
  1. #!/usr/bin/perl
  2. use Net::SSH::Perl;
  3. use Net::SFTP;
  4. my %sftp_args = (user =>'user1',password =>'password1');
  5. my %sftp_argspremium = (user =>'user2',password =>'password2');
  6. my $sftp = Net::SFTP->new('17.17.17.17', %sftp_args)
  7. or die "Cannot connect to Host ";
  8. print "CONNECTED\n";
  9. $sftp->get('remotefichier1','localfichier1');
  10. my $sftp2 = Net::SFTP->new('17.17.17.17', %sftp_argspremium)
  11. or die "Cannot connect to Host ";
  12. print "CONNECTED\n";
  13. $sftp2->get('remotefichier2','localfichier2');


merci de votre aide

Reply

Marsh Posté le 03-04-2005 à 14:35:13   

Reply

Marsh Posté le 04-04-2005 à 14:33:54    

j'ai resolu mon pb d'une maniere assez crade (j'ai pas trouve mieux).
une fois que j'ai fini mon premier import je lance un script shell qui boucle tant que netstat -tpa |grep 1023 renvoie quelque chose
quand rien n'est renvoye cela veut dire que le port est libre et je lance la deuxiemem connexion.
Ca fonctionne mais le temps d'attente est trop long entre les 2.

Reply

Marsh Posté le 04-04-2005 à 14:39:09    

essai simplement $sftp = undef;
ou réutilise la meme variable pour ton 2eme new:
 
my $sftp = Net::SFTP->new('17.17.17.17', %sftp_args)  
...
$sftp = Net::SFTP->new('17.17.17.17', %sftp_argspremium)  
 
dans les deux cas le résultat est le meme: comme il n'y a plus aucune reference vers l'objet, Perl fait un garbage collector et le detruit, ce qui doit entrainer la fermeture du socket

Reply

Marsh Posté le 04-04-2005 à 15:59:56    

j'avais essaye ca marche po.
toujours le meme probleme
en gros le port est en STATUS TIME_WAIT pendant une dizaine de secondes et je ne peux rien faire tant qu'il est pas libere

Reply

Marsh Posté le 04-04-2005 à 18:55:30    

il faudrait pouvoir fermer le socket, mais Net::SFTP ne donne aucune methode pour faire ca, ni meme pour le recuperer...
 
essai ca:
close($sftp->{ssh}->sock);

Reply

Marsh Posté le 05-04-2005 à 08:30:17    

ca marche pas non plus
Merci mille fois pour ton aide

Reply

Marsh Posté le 05-04-2005 à 15:02:17    

Pourquoi il essaie systématiquement de se binder au même port (1023) sur ta machine ?

Reply

Marsh Posté le 05-04-2005 à 16:29:25    

je ne sais pas , le faire choisir un autre port serait egalement une bonne solution
Mais comment faire?

Reply

Marsh Posté le 06-04-2005 à 10:55:45    

bon allez, on va encore tenter un truc:

Code :
  1. #!/usr/bin/perl
  2. use Net::SSH::Perl;
  3. use Net::SFTP;
  4. use Socket;
  5. my %sftp_args = (user =>'user1',password =>'password1');
  6. my %sftp_argspremium = (user =>'user2',password =>'password2');
  7. my $sftp = Net::SFTP->new('17.17.17.17', %sftp_args)
  8. or die "Cannot connect to Host ";
  9. make_reusable($sftp);
  10. print "CONNECTED\n";
  11. $sftp->get('remotefichier1','localfichier1');
  12. close_ssh($sftp);
  13. my $sftp2 = Net::SFTP->new('17.17.17.17', %sftp_argspremium)
  14. or die "Cannot connect to Host ";
  15. make_reusable($sftp2);
  16. print "CONNECTED\n";
  17. $sftp2->get('remotefichier2','localfichier2');
  18. close_ssh($sftp2);
  19. sub make_reusable {
  20. setsockopt($_[0]->{ssh}->sock, SOL_SOCKET,SO_REUSEPORT,1);
  21. }
  22. sub close_ssh {
  23. close($_[0]->{ssh}->sock);
  24. }


 
ca doit rendre le prot réutilisable apres que le socket ait été fermé

Reply

Marsh Posté le 14-04-2005 à 11:03:58    

Merci beaucoup de ton aide (desole d'avoir reagi si tard j'etais a l'etranger).
cpendant j'ai le message d'erreur suivant:

Code :
  1. Your vendor has not defined Socket macro SO_REUSEPORT, used at essai.pl line 27


Merci d'avance

Reply

Marsh Posté le 14-04-2005 à 11:03:58   

Reply

Marsh Posté le 14-04-2005 à 12:07:43    

bha tu dois etre sous windows... ya moyen de recuperer la valeur de cette constante qq part mais bon...
de toutes facon ca marchera pas à mon avis car il faut faire ca avant le bind, la ca doit deja etre trop tard.
 
bon en fouillant un peu dans le code des modules j'ai peut etre trouvé ce qu'il te fallait:
en fait le module ssh scan les port libre (au lieu de demander à l'os de lui en donner un...) et passe au suivant quand il recoit un message qui match /Address already in use/. Il plante si il recoit un autre message, disant qu'il ne peu pas binder (le message d'erreur que tu a). Le probleme c'est que ton systeme est en francais, et du coup kand le port est deja bindé il dit "adresse deja utilisée" au lieu de "adress already in use" !!!
du coup ce connard de module ssh croit que c'est une autre erreur!!
faudrait signaler ce bug à l'auteur du module.
En attendant il te faut patcher ta lib toi meme (ligne 235 de Net/SSH/Perl.pm).
 
bon en fait il semblerait qu'il y a une option pour laisser l'os choisir le port lui meme: privileged => 0 dans le new de SSH.
donc voila comment faire:

Code :
  1. #!/usr/bin/perl
  2. use Net::SSH::Perl;
  3. use Net::SFTP;
  4. my %sftp_args = (ssh_args => {privileged => 0}, user =>'user1',password =>'password1');
  5. my %sftp_argspremium = (ssh_args => {privileged => 0}, user =>'user2',password =>'password2');
  6. my $sftp = Net::SFTP->new('17.17.17.17', %sftp_args)
  7. or die "Cannot connect to Host ";
  8. print "CONNECTED\n";
  9. $sftp->get('remotefichier1','localfichier1');
  10. my $sftp2 = Net::SFTP->new('17.17.17.17', %sftp_argspremium)
  11. or die "Cannot connect to Host ";
  12. print "CONNECTED\n";
  13. $sftp2->get('remotefichier2','localfichier2');


 
tu passe ssh_args => {privileged => 0} en param à ton new, et SFTP passera ce param à SSH quant il le crera.
 
J'ai pas testé, mais ca devrait marcher

Reply

Marsh Posté le 14-04-2005 à 16:37:22    

je ne le repeterais jamais assez merci de ta precieuse aide
cependant cela ne fonctionne toujours pas j'ai la chose suivante:

Code :
  1. Not an ARRAY reference at /usr/lib/perl5/site_perl/5.8.0/Net/SFTP.pm line 36.


je tourne sous Red Hat 9.0
je ne vois pas trop quoi essayer
merci

Reply

Marsh Posté le 14-04-2005 à 17:59:10    

ok! tu dois avoir la version 0.8 (ou inferieur). j'ai regardé le code de la version 0.9 qui peu prendre une hash en param pour ssh_args et la convertie en array...
 
donc ca ca devrait marcher avec toutes les versions (avec une array ref au lieu d'une hash ref) :
 

Code :
  1. my %sftp_args = (ssh_args => [privileged => 0], user =>'user1',password =>'password1'); 
  2. my %sftp_argspremium = (ssh_args => [privileged => 0], user =>'user2',password =>'password2');


Reply

Marsh Posté le 17-04-2005 à 08:16:19    

ca marche!
Merci beaucoup pour ton aide
je vois que tu taquines en Perl (moi perso c'est mon premier module en perl)
A bientot

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed