Net::Telnet pour switch Linksys - Perl - Programmation
Marsh Posté le 03-05-2013 à 22:25:28
Bonjour
Bon, a vue de nez, je tenterais un truc type:
Code :
|
Vu ta session, il y a des caractères à envoyer sans \n ensuite, et les print en mettent un (sauf option output_record_separator mis a "", mais c'est a réserver a des cas spécifiques)
Pour faire ça, on utilise put et non print, je testerais avec des put la ou il faut, car les print peuvent faire échouer l'interprétation de ce que tu envoies.
Grosso modo, si dans une session manuelle, tu tapes quelque chose suivi de retour chariot, utiliser print, et sinon utiliser put.
Et si tu veux envoyer un seul \n, faire print(''); ou put ("\n" ); car print("\n" ) en envoie deux
A+,
Marsh Posté le 06-05-2013 à 09:55:45
Merci de ta réponse!!!
Et donc j'ai essayer en remplaçant les print par des put comme vous me l'avez conseillé et ça ne marche pas tout à fais. Je crois que ça n'écrit pas au bonne endroit où dans le désordre ou pas les mot pas entièrement fin du grand n'importe quoi!! :s
Voici ce que l'on a quand on se connecte en telnet sur ce switch :
Comme on peut le voir, quand on se connecte on arrive directement sur Edit donc on fait entrée
Puis le curseur arrive en face de "User Name:" la on écrit R2T, on fait tab ou entrée pas d'importance puis on arrive en face de "Password:" on écrit le mdp, Ensuite pour valider il faut faire la touche "échap" puis on arrive sur "Edit", ducoup on fait tab, on arrive sur "Execute" donc on fait "entrée", on refait entrée, on arrive à un menu et pour le quitter, il faut faire "contrôle+Z", enfin on peut écrire les lignes de commande soit après ">" on écrit "lcli" il nous redemande "User Name:" on ecrit R2T, et voila on est en # on peut faire copy startup-conf....
D'après vous c'est réalisable en Perl?
Marsh Posté le 06-05-2013 à 12:07:37
Bien sur, vu que c'est juste un envoi de touches.
Le pb est pas à ce niveau, le pb, c'est que c'est des screens qui sont envoyés et non pas des prompts.
Vu que Edit a de la video inverse, la chaine ne contient probablement pas Edit, mais une séquence avec des escape dedans et c'est la que le waitfor échoue.
Faudrait faire un dump:
$session->dump_log("logit.txt" );
$session->open($LK->{host});
$session->dump("" );
$session->close;
exit;
A partir de cela, on a des chances d'en savoir plus sur ce qui est envoyé.
Noter que pour le premier waitfor, Execute n'étant pas en inverse video, la chaine doit être sans parasites, et donc en remplaçant
$session->put("\n" ) if ($session->waitfor('/Edit/') == 1); par $session->put("\n" ) if ($session->waitfor('/Execute/') == 1);
on a des chances d'avancer d'un cran.
Citation : Comme on peut le voir, quand on se connecte on arrive directement sur Edit donc on fait entrée => print(''); |
Manque plus que les bons waitfor (voire rien si on peut s'en passer).
A+,
Marsh Posté le 06-05-2013 à 13:24:34
Alors j'ai rajouter le dump_log comme indiquer juste au dessu de la connexion et le dump à la fin du programme.
J'ai aussi remplacé le "Edit" par "Execute" ça me donne la même chose.
Et j'ai supprimé pas mal de waitfor, cela ne changeai rien!!
Voilà le résultat:
Code :
|
On voit bien qu'il tourne en rond et quand il écrit c'est tout d'un coup!!! :s
Marsh Posté le 06-05-2013 à 14:24:03
Bon déja, si on décode la session initiale, c'est clair:
// Clean up des 23 premières lignes |
A+,
Marsh Posté le 06-05-2013 à 14:33:47
Faudrait voir ou on en est avec
Code :
|
Si on bloque au niveau des
$session->print($LK->{log}) if ($session->waitfor('/ESC=Back/') == 1);
$session->put($LK->{pass}) if ($session->waitfor('/ESC=Back/') == 1);
il faudra tacher de dumper une vraie session pour voir ce qui est effectivement envoyé par le terminal.
A+,
Marsh Posté le 06-05-2013 à 14:43:00
Alors je crois qeu j'ai trouver!!!
Enfaite le programme allait trop vite pour le switch!!
Donc j'ai rajouté des tempo a différent endroit stratégique.
Et bim la config est la!! je poste tout a l'heure le prog!
Marsh Posté le 06-05-2013 à 14:47:34
A+,
Marsh Posté le 06-05-2013 à 15:06:50
Code :
|
Donc comme vous pouvez le constater j'ai rajouter des tempo, et puis bah ça marche. j'ai rajouter aussi des waitfor.
Merci bien de votre aide, mon gros programme de récupération de switch est normalement fini. Il faut que je le test en intégralité pour voir si il n'y pas de bug!!
Marsh Posté le 06-05-2013 à 15:23:38
Ah oui euh j'ai encore besoin de vous enfaite!! ^^
Comment pourrais-je faire pour que lorsque qu'un switch ne réponde pas ou que la commande ne passe pas, Il ne plante pas mon programme mais qu'il passe à l'autre ligne (autre adresse IP)?
c'est possible?
le programme complet:
Code :
|
Marsh Posté le 06-05-2013 à 16:25:41
C'est un jeu de piste:
Citation : Errors such as timing-out are handled according to the error mode action. The default action is to print an error message to standard error and have the program die. See the errmode() method for more information. |
Citation : error - perform the error mode action |
Citation : errmode - define action to be performed on error |
Bref, il va falloir mettre les sessions avec un errmode a return
A+,
Marsh Posté le 06-05-2013 à 17:02:48
Je vous remercie de votre réponse sa marche!!
j'ai rajouter errmode => sub {&error}); dans chaque new Net::Telnet()
et donc j'ai mit une ptite phrase pour prévenir.
sub error {
print "connexion échouée\n";
}
Mais enfaite j'ai toujours une petite erreur bizarre dans le script, c'est pour les config HP, il me les récupères bien sur le serveur TFTP mais dès qu'il l'a récupéré il me sort un command timed-out at test3.pl line 85
Je comprend pas pourquoi.
Marsh Posté le 06-05-2013 à 18:06:04
Citation : This method sends the command $string, and reads the characters sent back by the command up until and including the matching prompt. |
Peut être que le prompt attendu est différent de celui qui est envoyé.
Un dump devrait permettre de voir quel prompt est envoyé après exécution de la commande.
A+,
Marsh Posté le 07-05-2013 à 09:42:06
Oui c'est bien se que je pensais, mais se sont les même d'après le dump.
Code :
|
Bizarre non?
Marsh Posté le 07-05-2013 à 11:28:43
Bon non:
Les lignes 1-5, c'est ce que vous envoyez
les lignes 7-28, c'est ce qu'il envoie pour afficher la commande (une sorte de ACK je pense)
(Pour simplifier, j'utilise les valeurs de lignes et colonnes données, mais en principoe, tout est décalé de 1, les numérotations commençant à 0) |
Je me demande si ce n'est pas ce qui figure à la ligne 30 ("\n00029k " ) qui est le résultat de la commande (et qui indiquerait que son traitement est terminé)
A+,
Marsh Posté le 07-05-2013 à 13:06:04
Oui vous avez surement raison, mais alors comment peut on exploiter cette réponse qui ne signifie pas grand chose. J'ai chercher sur le net 00029k hp et cela corresponderai à une version OS du switch...aucun rapport.
Il faut ajouter quelques choses au script?
Marsh Posté le 07-05-2013 à 13:29:10
Et en faisant comme pour le Linksys?
$session->cmd("copy running-config tftp ".$backup->{host}.' '.$backup->{dir2}.'/'.$HP->{host}.'-'.today().".cfg\n\n\n" ) if ($session->waitfor('/#/') == 1);
vu qu'il y a l'air d'y avoir un hash dans la réponse du routeur HP (C21T008#)
EDIT: Manque les :// dans la commande après le tftp, non?
A+,
Marsh Posté le 07-05-2013 à 14:34:58
Alors oui j'avais penser à ça, mais manque de bol ça me donne exactement le même chose!!!
Et sinon la commande est bonne . Il ne faut pas mettre de :// .... pour HP, surement parce qu'il ne voulait pas faire comme les autres!!
Et bien je crois que je vais devoir laisser comme cela! Du moment que ça marche, je reviendrais dessus dans quelques jours peut-être. Car la j'ai un autre problème de script en expect cette fois-ci , impossible de faire "echappe" mais j'ai crus savoir que se n'etait pas votre domaine.
Merci de votre aide en tout cas!
Vous êtes bien caler en Perl!!
Kenavo
Marsh Posté le 03-05-2013 à 17:04:11
Bonjour à tous,
J'ai encore besoin de votre aide pour me connecter à un switch de marque Linksys (mais avec une version ancienne 1.0.2), j'ai un problème avec mon script il ne veut pas écrire le login et le mot de passe. Mais ensuite puir quitter ce menu il faut faire "echap" et bref ça fonctionne point.
je vous explique exactement la procédure de conexion.
A partir de la quand je lance le programme il me met "pattern match timed-out at link.pl line 48"
Mais j'ai fait un "$session->dump_log("logit2.txt" );"
je vois bien qu'il n'arrive pas à écrire le mot de passe!!
Que faire!!
Merci de votre aide!!
PA
(Gilou si tu veux mettre ce topic dans mon autre post pas de pb!! )