[Résolu] Quote Execute + Find pour le listing de fichier

Quote Execute + Find pour le listing de fichier [Résolu] - Perl - Programmation

Marsh Posté le 04-03-2012 à 18:01:31    

Bonjour,
 
Mon besoin est simple,
Depuis une machine je veux me connecter en ssh à une autre machine afin de récupérer une liste de fichier pour la traiter ensuite.
J'utilise SSH Expect
 
Quand je test ce même script sur autre serveur il fonctionne.
Quand je l'utilise sur le serveur cible, cela ne fonctionne pas à cause je pense d'un timeout?
 
Je requière donc votre aide pour trouver où cela coince.
 

Code :
  1. #!/usr/bin/perl -w
  2. # Purpose: SSH Expect
  3. use warnings;
  4. use strict;
  5. use MIME::Lite;
  6. use MIME::Lite::HTML;
  7. package Net::SMTP::TLS;
  8. use MIME::Base64;
  9. use Authen::SASL;
  10. use LWP::Simple;
  11. use File::Copy;
  12. use File::Find;
  13. use Net::SSH::Expect;
  14.  
  15. my $ssh = Net::SSH::Expect->new (
  16.    host => "10.212.13.14",
  17.    password=> 'PerlForever',
  18.    user => 'toto',
  19.    raw_pty => 1
  20. );
  21.  
  22. my $login_output = $ssh->login();
  23. if ($login_output !~ /Last/) {
  24.    die "Login has failed.\n";
  25. }
  26.  
  27. my $ls = $ssh->exec("ls -ltr /home/toto/201203*" );
  28. print($ls."\n" );
  29.  
  30. $ssh->close();
  31. __END__


 
Voici ce que j'obtiens en réponse:

Code :
  1. SSHAuthenticationError Login timed out. The input stream currently has the contents bellow: Last login: Sun Mar  4 17:50:33 2012 from 10.212.13.12
  2. The Following es are available
  3. [toto@SRV2 ~]$  at /usr/share/perl5/Expect.pm line 813


 
Quand j'ouvre le fichier /usr/share/perl5/Expect.pm à la ligne 813 j'ai

Code :
  1. $ret = &{$timeout_hook->[3]}($_[0]->[0]);


Message édité par Sethenssen le 06-03-2012 à 09:28:24
Reply

Marsh Posté le 04-03-2012 à 18:01:31   

Reply

Marsh Posté le 04-03-2012 à 21:31:51    

Ben et en changeant la valeur du timeout par défaut, ça donne quoi?
timeout => xxx
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-03-2012 à 00:25:05    

si je mets timeout => 30
cela va me mettre 30sec à m'afficher le même résultat

Reply

Marsh Posté le 05-03-2012 à 01:50:11    

De toute façon, la, ça ne vient pas du script, comme le prouve la ligne
>> Quand je test ce même script sur autre serveur il fonctionne.  
Ça vient apparemment de ta configuration SSH, et j'ai pas de billes la dessus.
A tout hasard, lances le script avec l'option
debug => 1
A+,


Message édité par gilou le 05-03-2012 à 01:50:57

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-03-2012 à 21:22:54    

Bonsoir,
 
Pour ma requête je vais laisser tomber ssh expect et le faire directement

Code :
  1. my $ls = `ssh toto\@srv-02 find /home/toto -maxdepth 1 -type f -name "TXT*" -mtime 0`;
  2. chop $ls;
  3. print($ls."\n" );


Ceci fonctionne bien,
Cependant je voudrai trier la liste des fichiers trouvés pour ainsi ne récupérer que les 2 dernières concurrences.
 
Comme si sur la machine je faisais en local un :

Code :
  1. ls -ltr `find /home/toto -maxdepth 1 -type f -name "TXT*" -mtime 0` | tail -2


 
Donc j'essaye tout bêtement d'intégrer mon ls -ltr dans mon find, mais cela ne fonctionne pas
 

Code :
  1. my $ls = `ssh toto\@srv-02 ls -ltr ``find /home/toto -maxdepth 1 -type f -name \"TXT*\" -mtime 0```;
  2. chop $ls;
  3. print($ls."\n" );


 
Une p'tite aide ne serait pas de refus !
Merci.


Message édité par Sethenssen le 05-03-2012 à 21:23:43
Reply

Marsh Posté le 05-03-2012 à 22:36:44    

Pourquoi pas essayer de passer par un quote execute plutôt que les backticks?

Code :
  1. my $ls = qx{ssh toto\@srv-02 ls -ltr `find /home/toto -maxdepth 1 -type f -name "TXT*" -mtime 0` | tail -2};


ou  

Code :
  1. my $ls = qx{ssh toto\@srv-02 ls -ltr `find /home/toto -maxdepth 1 -type f -name "TXT*" -mtime 0`};


A+,


Message édité par gilou le 05-03-2012 à 22:39:10

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 05-03-2012 à 22:48:07    

Car je ne maîtrise pas du tout encore le quote execute,
Cependant cela n'affiche pas le résultat escompté
 
Il me dit:
 
find: `/home/toto': No such file or directory
 
Je précise que les fichiers sont bien présents et que ce message je l'ai déjà eu avec mes backticks

Reply

Marsh Posté le 05-03-2012 à 23:17:08    

Faut tester jusqu'a ce que ça passe, je suis trop grippé pour bien réfléchir ce soir.
Je tenterais
my $ls = qx{ssh toto\@srv-02 ls -ltr \`find /home/toto -maxdepth 1 -type f -name "TXT*" -mtime 0\`};
a tout hasard
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 06-03-2012 à 08:51:23    

Je tente, je tente mais sans succès
Du coup j'essaye de le faire directement dans le find, j'ai trouvé que le "-ls" était possible
 

Code :
  1. my $ls = qx{ssh toto\@srv-02 find /home/toto -maxdepth 1 -type f -name "TXT*" -mtime 0 -ls};


Mais hélas il me manque que le tri, et je n'ai pas trouvé dans le find de sort ou le fameux -ltr :(

Reply

Marsh Posté le 06-03-2012 à 09:24:55    

C'est bon cela fonctionne avec un simple sort
 

Code :
  1. my $ls = qx{ssh toto\@srv-02 find /home/toto -maxdepth 1 -type f -name "TXT*" -mtime 0 -ls | sort -k9};


 
Merci !


Message édité par Sethenssen le 06-03-2012 à 09:28:04
Reply

Marsh Posté le 06-03-2012 à 09:24:55   

Reply

Marsh Posté le 06-03-2012 à 11:34:13    

Un truc comme cela:

Citation :

my $ls = `ssh toto\@srv-02 ls -ltr \`find /home/toto -maxdepth 1 -type f -name \"TXT*\" -mtime 0\``;


devait pas être très éloigné de la solution, car au vu d'une page web, les `dans un `doivent être escapés.
Après, il faut voir ce qui doit être escapé ou pas dans le reste, " ou \" par exemple.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 07-03-2012 à 21:04:41    

Merci Gilou,
 
J'ai une dernière question
Avec quote execute, est-ce que l'on peut entrer en paramètre le mot de pass du serveur distant?
Ou bien est-on obligé de copier les clé rsa sur le serveur distant?
 
Je dis ça car je travail sur un serveur Cisco là où il m'est impossible d'y copier les clés.
Expect SSH est une bonne solution car je peux rentrer le login/pwd en paramètre

Reply

Marsh Posté le 07-03-2012 à 22:39:33    

Dans le texte d'un quote execute, on peut mettre des variables perl, qui seront évaluées à l'exec.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 07-03-2012 à 22:42:19    

Ok merci.

Reply

Sujets relatifs:

Leave a Replay

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