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

Langage Perl Discussion :

Envoi de fichiers par un pipe créé avec open().


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de zanker
    Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Par défaut Envoi de fichiers par un pipe créé avec open().
    Bonjour,

    mon problème, dans le code suivant, est que je ne peux pas envoyer plus d'un fichier sur le serveur distant.

    Pourtant mon expression régulière match bien avec plusieurs fichiers. La boucle avec le 1er print() affiche bien tous les noms des fichiers à envoyer. Mais seul le premier fichier listé est déposé sur le serveur distant.

    J'ai essayé en commentant la ligne "next if ()" et l'envoi de tous les fichiers fonctionne à merveille. Tous les fichiers sont déposés sur le serveur distant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    opendir(my $fh_rep, $REP_SOURCE) or die("Impossible d'ouvrir le repertoire source: ".$!);
    open(my $fh_pipe, '|ssh '.$USER_DISTANT.'@'.$HOST_DISTANT." 'cd ".$REP_DISTANT."; tar -xf -'") or die("Impossible d'ouvrir le flux TAR over SSH: ".$!);
    while( (my $fic_data = readdir($fh_rep)) )
    {	next if ($fic_data !~ m/^\d{7}\.txt$/);
    	print("Envoi le fichier '".$fic_data."'\n");
    	my $commande_a_lancer = 'cd '.$REP_SOURCE.'; tar -cf - '.$fic_data;
    	print($fh_pipe `$commande_a_lancer`);
    	my $CR = $?>>8;
    	print("Une erreur s'est produite sur l'envoi du fichier '".$fic_data."'.\n") if ($CR != 0);
    }
    close($fh_pipe);
    Pouvez-vous m'expliquer pourquoi je ne peux pas filtrer à la volé la lecture de mon répertoire et faire un envoi sélectif ?
    Quelle est la solution si je ne souhaite pas passer par 2 boucles (une qui liste les fichiers voulu et l'autre qui les envoie) ?

    Merci d'avance pour votre aide.

  2. #2
    Membre émérite Avatar de messinese
    Homme Profil pro
    IT Security Consultant
    Inscrit en
    Septembre 2007
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IT Security Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2007
    Messages : 429
    Par défaut
    Bonjour,

    j'ai récemment eu a quelque chose prés le meme code a developper , je te paste un exemple de code qui doit pas etre trop mal (j'ai essayer d'adapter a ton cas en modifiant ma source donc on est pas a l'abrit d'une petite faute par-ci, par la )en tout cas j'ai procédé comme suitet ça fonctionne trés bien ( si ça peut donner quelques pistes..) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    opendir(my $fh_rep, $REP_SOURCE) or die("Impossible d'ouvrir le repertoire source: ".$!);
    open(my $fh_pipe, '|ssh '.$USER_DISTANT.'@'.$HOST_DISTANT." 'cd ".$REP_DISTANT."; tar -xf -'") or die("Impossible d'ouvrir le flux TAR over SSH: ".$!);
     
     
    my @files readdir($fh_rep);
     
        foreach my $find(@files){
                                    if($find =~ m/^\d{7}\.txt$/){
    								                        unless($find =~ m/^\d{7}\.txt$/){
    														                            say("Une erreur s'est produite sur l'envoi du fichier '".$fic_data)
                                                                                         exit(TRUE);
    																					 }
    														else{							 
    								                             say("Envoi le fichier '".$find);
    	                                                            my $commande_a_lancer = ('cd '.$REP_SOURCE.'; tar -cf - '.$find);
    	                                                         say($fh_pipe `$commande_a_lancer`);
    													        	my $CR = $?>>8;
    														}
    				           									 }
     
    														}
    close($fh_pipe);

  3. #3
    Membre averti Avatar de zanker
    Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Par défaut
    Merci pour ton aide, mais ton code ne solutionne pas mon problème.
    Il m'est toujours impossible de garder le pipe SSH ouvert et d'y envoyer une sélection de fichiers dans ma boucle de lecture du répertoire (readdir).
    C'est aussi le même problème en passant par une variable tableau contenant la liste des fichiers.

    N'ayant pas de solution, je traite l'envoi du répertoire complet sans restreindre les fichiers à l'intérieur.
    Puis je rouvre un nouveau pipe SSH à chaque envoi d'un nouveau répertoire.

    Merci.

  4. #4
    Membre averti Avatar de zanker
    Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 23
    Par défaut
    Si aujourd'hui j'utilise une solution de contournement, qui ne me plait pas, je suis toujours preneur d'autres solutions ou éléments de solutions.

  5. #5
    Membre chevronné Avatar de Mandraxx
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2011
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 182
    Par défaut
    Bonjour,

    Est-ce que ça ne serait pas dû au fait que tu lances tar à chaque itération ?
    Du coup, le tar qui est de l'autre côté du tunnel détecte un fichier puis un EOF après le premier passage et rend la main.

    A mon avis, il faudrait trouver un moyen de ne lancer qu'une seule commande tar côté émetteur vu qu'il y a qu'un seul process tar en écoute (structure -> serialisation tar -> tunnel SSH -> déserialisation tar -> reconstruction de la structure).

    Par exemple, en concaténant la liste des fichiers dans une variable ou en créant un fichier à passer en option d'un -T si il y a trop de fichiers.

    @+

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Mandraxx a tout à fait raison.
    Tu peux par exemple utiliser Archive::Tar ou Archive::Tar::Steamed pour créer ton archive à partir de ta liste de fichier filtrée, et l'envoyer par ssh en une fois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    use Archive::Tar::Streamed;
     
    opendir(my $fh_rep, $REP_SOURCE) or die("Impossible d'ouvrir le repertoire source: ".$!);
     
    open(my $fh_pipe, '|ssh '.$USER_DISTANT.'@'.$HOST_DISTANT." 'cd ".$REP_DISTANT."; tar -xf -'") or die("Impossible d'ouvrir le flux TAR over SSH: ".$!);
     
    my $tar = Archive::Tar::Streamed->new($fh_pipe);
    $tar->add(grep /^\d{7}\.txt$/, glob("$REP_SOURCE/*"));
    close($fh_pipe);
    Je précise que je n'ai pas testé le code.

Discussions similaires

  1. Envoi de fichier par socket
    Par thebloodyman dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 30/08/2007, 17h07
  2. Envoi de fichier par socket
    Par dr_octopus74 dans le forum Réseau
    Réponses: 42
    Dernier message: 19/01/2007, 17h59
  3. [HTTP] Envoi de fichiers par http post
    Par java_girl dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 28/08/2006, 16h44
  4. [HTTP] Envoi de fichiers par http
    Par Delendial dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 03/09/2004, 09h37
  5. [Débutant] Envoi de fichier par socket
    Par zapho dans le forum Entrée/Sortie
    Réponses: 13
    Dernier message: 26/05/2004, 18h58

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