Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2919 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  Probleme de socket dans petit script sftp Perl

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probleme de socket dans petit script sftp Perl

n°1033568
betsamee
Asterisk Zeperyl
Posté le 03-04-2005 à 14:35:13  profilanswer
 

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

mood
Publicité
Posté le 03-04-2005 à 14:35:13  profilanswer
 

n°1034334
betsamee
Asterisk Zeperyl
Posté le 04-04-2005 à 14:33:54  profilanswer
 

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.

n°1034339
pospos
Posté le 04-04-2005 à 14:39:09  profilanswer
 

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

n°1034428
betsamee
Asterisk Zeperyl
Posté le 04-04-2005 à 15:59:56  profilanswer
 

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

n°1034655
pospos
Posté le 04-04-2005 à 18:55:30  profilanswer
 

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);

n°1035273
betsamee
Asterisk Zeperyl
Posté le 05-04-2005 à 08:30:17  profilanswer
 

ca marche pas non plus
Merci mille fois pour ton aide

n°1035871
matafan
Posté le 05-04-2005 à 15:02:17  profilanswer
 

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

n°1036041
betsamee
Asterisk Zeperyl
Posté le 05-04-2005 à 16:29:25  profilanswer
 

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

n°1036921
pospos
Posté le 06-04-2005 à 10:55:45  profilanswer
 

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é

n°1047097
betsamee
Asterisk Zeperyl
Posté le 14-04-2005 à 11:03:58  profilanswer
 

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

mood
Publicité
Posté le 14-04-2005 à 11:03:58  profilanswer
 

n°1047209
pospos
Posté le 14-04-2005 à 12:07:43  profilanswer
 

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

n°1047625
betsamee
Asterisk Zeperyl
Posté le 14-04-2005 à 16:37:22  profilanswer
 

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

n°1047755
pospos
Posté le 14-04-2005 à 17:59:10  profilanswer
 

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');


n°1050023
betsamee
Asterisk Zeperyl
Posté le 17-04-2005 à 08:16:19  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  Probleme de socket dans petit script sftp Perl

 

Sujets relatifs
Probleme sur javascript adresse ip enProbleme avec la fonction exif_read_data()
Problème JAVA dans PHPProbleme appeller procedure...
Problème sur le bon vieux quickBasic!!!Probleme Buffer ??
Probleme d'accent dans un fichier batchProblème d'impression CSS sous IE
Problème input type='hidden' 
Plus de sujets relatifs à : Probleme de socket dans petit script sftp Perl


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR