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

Modules Perl Discussion :

[Net::Telnet] Depassement du buffer ?


Sujet :

Modules Perl

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2009
    Messages : 37
    Points : 40
    Points
    40
    Par défaut [Net::Telnet] Depassement du buffer ?
    Bonjour à tous,

    J'ai un soucis avec le retours d'une commande Unix passée au travers d'un objet Net::Telnet. Le retour n'est pas placé comme il devrait dans un variable de recupération (une liste en l'occurence) et même si j'ai une idée de la cause je sèche coté résolution..

    La commande en question est un 'find' qui remonte un nombre important de fichiers (environs 15k malgres un grep pour essayer d'alleger un peu le retour). Après plusieurs essais il semble que le retour de la commande soit coupé en plein milieu, ce qui n'arrive pas quand j'ai moins de fichiers (je n'ai pas de soucis quand il y a 200 ou 300 fichiers par exemple).

    En condensé mon code ressemble à cela:
    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
    use strict;
    use warnings;
     
    use Net::Telnet;
     
    (crunch...)
     
    my $remote_system = new Net::Telnet(Errmode => "return", Prompt => '/(\(.*@.*:\/.*\/.*\))|(.*-\/.*>)/', Timeout => 30);
    my $fh = $remote_system->dump_log("./telnet.dump.log");
     
    $remote_system->open('MonHost');
    $remote_system->login(Name=>'monuser', Password=>'monpasswd');
     
    my @Rmt_Files = $remote_system->cmd('find /monrep | grep .log$'); # Environs 15,000 fichiers pour cette commande en mode console
     
    print "@Rmt_Files\n"; # @Rmt_Files est vide
     
    (re-crunch...)
     
    $remote_system->close;
    close($fh);
     
    exit 0;
    Le fichier log (qui fait dans les 5Mo) s’interrompt en plein milieu d'un nom de fichier remonté par la commande. L'interruption n'a pas toujours lieu exactement au même endroit, mais c'est toujours assez proche et sur la ligne 0x01ff0. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    (crunch)
    < 0x01fc0: 37 30 35 30  33 2f 73 68  65 6c 6c 2f  70 61 72 61  70503/shell/para
    < 0x01fd0: 6d 2f 53 4f  2e 44 50 4c  54 5f 53 49  53 43 2e 44  m/SO.DPLT_SISC.D
    < 0x01fe0: 50 4c 54 5f  45 4e 53 43  2e 44 4f 54  2e 2e 53 4f  PLT_ENSC.DOT..SO
    < 0x01ff0: 2e 44 50 4c  54 5f 45 4e  53 43 2e 44  4f 54 2e 34  .DPLT_ENSC.DOT.4
    (plus rien, pas de prompt)

    En l'absence d'un prompt reconnaissable dans le flux je ne m'étonne pas de ne rien avoir dans ma variable puisque Net::Telnet se base sur cela pour savoir que la commande s'est terminée.

    Par contre je n'arrive pas à faire en sorte que le retour de la commande se termine. J'ai passé la taille du buffer à 10 fois sa taille normale sans effet notable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $remote_system->max_buffer_length(10 * $remote_system->max_buffer_length()); #aucun effet
    Est-ce que quelqu'un a déjà été confronté à ce type de difficultés avec ce module ? Si oui, comment cela peut être résolu ?

    Merci d'avance

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Essaye peut-être l'option Dump_Log peut debugger ton programme ou tout autre méthode.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2009
    Messages : 37
    Points : 40
    Points
    40
    Par défaut
    C'est deja grace au dump_log que j'ai vu qu'il s'arretait en milieu de retour de commande...

    Pour avancer j'ai decoupé la récupération pour la répartir en fonction des sous-répertoires dans /monrep mais c'est n'est pas une solution de fond: sans savoir ce qui declenche cette coupure il suffit qu'un des sous-repertoires ai lui même un nombre très (trop) important de fichiers pour que ça plante à nouveau

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Il se peut qu'il y ait une limitation de tailles. Tu pourrais envisager de faire d'une autre façon. Tu liste les répertoires et sous-répertoires (ça t'en fera déjà moins). Ensuite tu boucles sur chaque répertoire pour récupérer les informations de chacun d'eux. Ainsi, ça te ferait certes plus de commandes, mais beaucoup moins de données en mémoire.

Discussions similaires

  1. module net::telnet
    Par calimero642 dans le forum Modules
    Réponses: 2
    Dernier message: 14/04/2006, 11h15
  2. Aide net:telnet
    Par gege_76 dans le forum Modules
    Réponses: 6
    Dernier message: 05/04/2006, 12h30
  3. [VB.NET] Probleme avec un buffer
    Par Aspic dans le forum VB.NET
    Réponses: 1
    Dernier message: 14/12/2005, 16h17
  4. la méthode get du Net::telnet
    Par BENCHEKROUN dans le forum Modules
    Réponses: 4
    Dernier message: 25/05/2005, 12h31
  5. [vb.net] Comment vider un buffer ?
    Par mdc dans le forum Windows Forms
    Réponses: 4
    Dernier message: 16/12/2003, 15h43

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