[PERL] Simuler touche clavier [Fermé]

Signaler
-
 sk66 -
Bonjour,

je cherche à savoir comment simuler l'appui sur une touche clavier en perl. mes recherches n'ont rien donné. l'instruction print ne suffit pas. mon script fait un telnet en direction d'un switch mais à l'ouverture de la fenetre, le message suivant apparait "Press any key to continue...". Il faut donc simuler l'appui sur une touche.

Avez vous des idées ?

Merci

10 réponses

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 542
Salut,

#!/usr/bin/perl
use strict;use warnings;
use Term::ReadKey;#voir http://search.cpan.org/dist/TermReadKey/ReadKey.pm

ReadMode 4;
print "Press any key to continue...\n";
while (not defined (ReadKey(-1))) {}
ReadMode 0;
Peux tu m'aider à l'intégrer dans ce script (qui lui fonctionne) :

#!/usr/bin/perl

use strict;use warnings;
use Net::Telnet;
my $Ligne;
my @tab;
my $base;
$base= "C:\\chemin\database_switch2.txt"; #chemin vers un fichier contenant les switch (hostname et ip)

open (BASE,"$base" ) or die "can't open file\n";

while ($Ligne=<BASE>)
{ my ($nom, $ip);

if($Ligne =~ /(.*);(.*);/)
{ push @tab, $1, $2;
$nom = $1;
$ip = $2;
print ("\nHost : $nom\n" ); # test
print ("IP : $ip\n" ); # test
}

else { print("Erreur lecture de ligne : $.\n" ); }

my $switch_ip = $ip;
my $switch_port = 23;
my $telnet_session;

# ouverture de connexion telnet et copie du fichier de config

$telnet_session= new Net::Telnet ('Errmode' => 'return','Timeout' => 5);
if (not defined $telnet_session)
{ &print_error("Connect Telnet Session - IP: $switch_ip PORT: $switch_port\n");
return (1); }

$telnet_session->open('Timeout' => 5, 'Errmode' => 'return', 'Host' => $switch_ip, 'Port' => $switch_port)
or die "connexion au switch $switch_ip echoue\n";

# c'est a ce niveau que l'appui sur une touche est demandé (avant la demande de login)
$telnet_session->print('\nAdministrateur');
$telnet_session->print('xxxxx');

my @lines = $telnet_session->cmd("copy startup-config tftp 172.16.x.x $nom.txt");
$telnet_session->close; }

close (BASE);
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 542
Re,

Je n'ai pas testé (j'ai mis en gras)
Pense à la lisibilité de ton code, j'ai fait quelques améliorations
#!/usr/bin/perl 

use strict;use warnings; 
use Net::Telnet; 
use Term::ReadKey;
my $Ligne; 
my @tab; 
my $base; 
$base= "C:\\chemin\database_switch2.txt"; #chemin vers un fichier contenant les switch (hostname et ip) 

open (BASE,"$base" ) or die "can't open file\n"; 

while ($Ligne=<BASE>) 
{ my ($nom, $ip); 

  if($Ligne =~ /(.*);(.*);/) {
    push @tab, $1, $2; 
    ($nom,$ip) = ($1,$2); 
    print ("\nHost : $nom\nIP : $ip\n" ); # test 
  } else { 
    print("Erreur lecture de ligne : $.\n" ); 
  } 

  my $switch_ip = $ip; 
  my $switch_port = 23; 
  my $telnet_session; 

# ouverture de connexion telnet et copie du fichier de config 

  $telnet_session= new Net::Telnet ('Errmode' => 'return','Timeout' => 5); 
  if (not defined $telnet_session) { 
    &print_error("Connect Telnet Session - IP: $switch_ip PORT: $switch_port\n"); 
    return (1); 
 } 

  $telnet_session->open(
                                  'Timeout' => 5, 
                                  'Errmode' => 'return', 
                                  'Host'    => $switch_ip, 
                                  'Port'    => $switch_port
   ) or die "connexion au switch $switch_ip echoue\n"; 

# c'est a ce niveau que l'appui sur une touche est demandé (avant la demande de login) 
  ReadMode 4;
  print "Press any key to continue...\n";
  while (not defined (ReadKey(-1))) {}
  ReadMode 0;

  $telnet_session->print('\nAdministrateur'); 
  $telnet_session->print('xxxxx'); 

  my @lines = $telnet_session->cmd("copy startup-config tftp 172.16.x.x $nom.txt"); 
  $telnet_session->close; 
} 

close (BASE);
Merci bien mais ca ne fonctionne pas. En fait, quand je fais un telnet en direction d'un switch, certains me demandent directement le login et mot de passe et là ca fonctionne. Les fichiers de config sont bien copiés vers le répertoire. Mais d'autres me demande avant d'appuyer sur une touche du clavier. C'est pourquoi je veux simuler l'appui sur une touche.

Apparemment ca ne fonctionne pas mais je sens qu'on y est presque...

ps : j'essaie d'améliorer la lisibilité de mon code mais ce n'est pas ma vocation première :/
Cette manipulation est peut-être impossible à réaliser dans ce langage. Je ne sais pas...
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 542
Re,

Je ne comprends pas en fait.
Pourquoi n'utilises tu

$telnet_session->login($username, $passwd);

?

Comme ça quand tu as username et passwd tu les saisies et si tu n'as pas tu ne mets rien.
J'ai essayé mais ca ne marche pas. Ca ne copie pas les fichiers.
Le truc c'est que comme je l'ai dit : le programme marche sur certains switchs, ceux qui ne demandent pas l'appui sur une touche avant d'afficher la demande de login/passwd. Quand j'effectue un telnet vers les autres switchs (ceux qui affichent "Press any Key to continue...") avant de demander le login/passwd, le programme ne marche pas. C'est parait difficile à comprendre mais c'est très simple.

Je cherche donc une commande, fonction ou autre permettant de simuler l'appui sur une touche avant la demande de login/passwd.

$telnet_session->login($username, $passwd);

Ca ne marche pas pour moi et de toute facon ce n'est pas le problème car j'arrive à me connecter et à envoyer le fichier vers mon serveur TFTP. Sauf quand on me demande l'appui sur une touche avant.

Car le but de mon programme est la sauvegarde des configs des switchs, je pense que tu l'avais remarqué.

Voila.
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 542
Salut,

Il faut que tu me montres une exemple d'exécution.
J'ai testé chez moi, et je n'ai pas d'affichage de login/passwd ni de Press any key.....
Oui car ce sont des switch HP ProCurve. Cela depend de la marque et du firmware. Je ne peux pas mettre d'image ici. Mais ce message est connu. Il existe sur d'autres équipements.

Je lance mon serveur TFTP puis je lance le script qui va se connecter en telnet sur les switch et executer la commande "copy ..... " afin de copier les fichiers de conf sur mon serveur. Une fois le script executé, tous les fichiers (texte) se retrouvent à la racine de mon serveur. Et ca fonctionne. Mais seulement avec des équipements ou une connexion en telnet demande directement le login/mdp. Ceux ou il faut appuyer une touche avant ca ne marche pas. Normal.

D'ou ma question pour "simuler l'appui sur une touche". Tout simplement.
Si ca marche chez toi, et que tu n'as pas de demande de login/mdp c'est que l'accès à tes switchs n'est pas sécurisé, ce qui peut paraitre normal si c'est chez toi. Mais dans une entreprise c'est différent...