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:
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:
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
$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
Partager