[perl]script sauvegarde, telnet

script sauvegarde, telnet [perl] - Perl - Programmation

Marsh Posté le 14-01-2009 à 15:18:47    

Bonjour,
 
J'ai un script à réaliser pour mon entreprise!
Ce script aura pour but de se connecter sur mes switchs en telnet (utilisation du module net::telnet), et de faire une copie de la configuration des switchs, le tout sera envoyé ver mon serveur TFTP! Pour les connections aux switchs j'ai un fichier .txt avec sur la meme ligne le :

Code :
  1. nom ip login mdp


 
Donc le contenue je le remet dans un tableau pour pouvoir les réutiliser!
Donc j'ai encore quelques problèmes pour faire les séparations sinon sa marche!!

Code :
  1. my $base;
  2.     $base= "/script_backup/database_switch.txt";
  3. open (BASE,"$base" ) or die "can't open file\n";
  4. my $Ligne;
  5. my @tab;
  6. while ($Ligne=<BASE> )
  7. {
  8.     my ($nom, $ip, $login, $mdp);
  9. #    print $Ligne."\n";                                                                                                     
  10. # Condition en expression reguliere d'une ligne du fichier txt sous la forme                                               
  11. # nom ip login mdp                                                                                                         
  12.     if($Ligne =~ /(.*)\s(.*)\s(.*)\s(.*)/)   # J'ai un PB ici je pense! ne diserne pas l'espace entre le nom et IP........
  13.     {
  14.         push @tab, $1, $2, $3, $4;
  15. $nom = $1;
  16. $ip = $2;
  17. $login = $3;
  18. $mdp = $4;
  19. print ("nom=$nom\n" ); # test
  20. print ("ip=$ip\n" ); # test
  21. print ("login=$login\n" ); # test
  22. print ("mdp=$mdp\n" ); # test
  23. #       print ("$nom $ip $login $mdp" ); # test
  24.     }
  25.     else
  26.     {
  27.         print("Erreur lecture de ligne : $.\n" );
  28.     }
  29. }
  30. close (BASE);


Le probleme ici etant que je resors pas dans le bonne ordre le contenue du tableau
j'obtiens pour la 1er ligne:

Code :
  1. nom=SWO1 10.42.78.1
  2. ip=user1
  3. login=mdp1
  4. mdp=


 
 
Mais le gros problème c'est la connexion en telnet...donc j'aurais besoin de vous pour m'aider!!

Code :
  1. #!/usr/bin/perl
  2. # strict demande de definir les variables
  3. use strict;
  4. # warnings permet d'avoir des messages d'erreurs
  5. use warnings;
  6. # Module pour la connection Telnet
  7. use Net::Telnet qw(TELOPT_TTYPE); #qw(TELOPT_TTYPE) sert a quoi???
  8. use IO::Handle;    # a quoi sa sert sa??? je l'ai mis parceque j'ai un modele
  9.     my $switch_ip ='X.X.X.X'; # je met juste ca comme j'ai pas mis de MDP ni login
  10.     my $switch_port = 12; # je  met le n° port sur lequel je suis brancher
  11.     my $telnet_session = new Net::Telnet (
  12.                                          'Host' => $switch_ip,
  13.                                          'Port' => $switch_port,
  14.                                          'Errmode' => 'return',
  15.                                          'Timeout' => 20,);


 
Normalement juste ca devrait me connecter au switch non??
 
Merci de m'aider!!!!!!!!!!!!!!!!!!!!

Reply

Marsh Posté le 14-01-2009 à 15:18:47   

Reply

Marsh Posté le 14-01-2009 à 15:18:59    

Re j'ai modfier mon fichier .txt pour ne plus avoir de pB au niveau du tableau!

Code :
  1. while ($Ligne=<BASE> )
  2. {
  3. my ($nom, $ip, $login, $mdp);
  4. # print $Ligne."\n";
  5. # Condition en expression reguliere d'une ligne du fichier txt sous la forme
  6. # nom;ip;login;mdp;
  7. if($Ligne =~ /(.*);(.*);(.*);(.*);/) # j'ai modifier ici parcequ'avec les espaces j'avais un décalage donc j'ai mis de ";"
  8. {
  9. push @tab, $1, $2, $3, $4;


UPPP
Merci de m'aider!!!!!!


Message édité par parisien91 le 14-01-2009 à 15:19:29
Reply

Marsh Posté le 15-01-2009 à 09:22:25    

UP!!! SVP

Reply

Marsh Posté le 15-01-2009 à 09:46:00    

Pour ta 1ère regex

Code :
  1. if($Ligne =~ /(.*)\s(.*)\s(.*)\s(.*)/)

chez moi ca marche. Au vu de la regex, il y a de grandes chances que ton fichier d'entrée ne soit pas bon (ou au choix, que ta regex soit mal construite)
Exemple : si tu lui mets la ligne "SWO1 10.42.78.1 user1 mdp1" ca marche mais si tu lui mets la ligne "SWO1 10.42.78.1 user1 mdp1 " (note l'espace à la fin de la ligne) tu te retrouves dans la situation que tu as décrite.
Vu la simplicité de la ligne à parser, je te conseillerais plutôt d'utiliser la fonction split
 
Pour ton second problème (là où tu changes de regex) tu ne nous dis pas quel est le problème...

Reply

Marsh Posté le 15-01-2009 à 11:51:13    

salut couak,
merci de t'attardé sur mes PBs!
 
pour revenir au " if($Ligne =~ /(.*)\s(.*)\s(.*)\s(.*)/)", chez moi sa ne marche toujours pas!,il y a encore le pb mais je l'ai changé j'ai mis des ";" entre chaque colonnes comme sa plus de problemes et sa marche!!
 
le probleme maintenant etant a la connexion telnet!.............

Reply

Marsh Posté le 15-01-2009 à 12:53:57    

je sais pas si tu m'as lu (on dirait pas) mais je t'avais dis que ta regex était mal construite, change ta regex ou bien utilises la fonction split
 
pour ton problème de telnet, envoie ton code et tes problèmes et message d'erreur

Reply

Marsh Posté le 15-01-2009 à 13:17:25    

Si je t'es lu, mais tu appelle quoi 'regex' c'est que la 2eme fois que je fais un script perl... dsl...
la regex c'est ma condition if(....) c'est sa! Donc maintenant comme j'ai modifier mon fichier.txt avec des ";" et que sa marche je touche plus!!
 
tiens j'ai poster sur un autre forum
http://www.developpez.net/forums/d [...] iguration/
 
Merci d'avance

Reply

Marsh Posté le 16-01-2009 à 15:02:45    

bonjour,
J'ai encore un peu avancé mais je suis vraiment bloqué!!
 

Code :
  1. my $switch_ip = $ip;                                                                     
  2.     my $user_login = $login;
  3.     my $user_password = $mdp;
  4.     my $switch_port = 23;
  5.     my $telnet_session;
  6.     $telnet_session= new Net::Telnet (                                     
  7.                                       'Errmode' => 'return',
  8.                                       'Timeout' => 30,
  9.                                       );
  10.     if (not defined $telnet_session)
  11.     {
  12.         &print_error("Connect Telnet Session - IP: $switch_ip PORT: $switch_port\n" );
  13.         return (1);
  14.     }
  15.                 ## Fonction necessaire a net::telnet                                                                       
  16.     $telnet_session->option_callback(\&opt_callback);
  17.     $telnet_session->option_accept('Do' => TELOPT_TTYPE);
  18.     $telnet_session->suboption_callback(\&subopt_callback);
  19.     $telnet_session->open('Timeout' => 5, 'Errmode' => 'return', 'Host' => $switch_ip, 'Port' => $switch_port) or die "conn\
  20. exion au switch $switch_ip echoue\n";
  21.     sleep 1;
  22.     my @lines = $telnet_session->print('show ru');
  23.     print "show running = @lines\n";


 
Comme j'avais pas de messages d'erreurs pour la connexion, j'ai fais un test avec une commande show sur le switch sauf que je recoit  

Code :
  1. show running = 1


 
donc comment faire?? d'ou cela peux venir???

Reply

Marsh Posté le 17-01-2009 à 11:52:40    

parisien91 a écrit :

Comme j'avais pas de messages d'erreurs pour la connexion, j'ai fais un test avec une commande show sur le switch sauf que je recoit  

Code :
  1. show running = 1


 
donc comment faire?? d'ou cela peux venir???


 
Eh bien c'est clair: ca vient de ta ligne

parisien91 a écrit :

Code :
  1. print "show running = @lines\n";



 
Qu'est-ce qui te fais dire que tu n'es pas connecté? au contraire, ca montre que tu l'es, puisque la commande my @lines = $telnet_session->print('show ru'); semble s'être executé correctement ce qui explique la valeur 1 de @lines (mais pour en être sur il faudrait avoir un objet scalaire et non un array pour recuperer la valeur de retour de $telnet_session->print d'apres la doc):

Citation :

print - write to object
 
        $ok = $obj->print(@list);
 
    This method writes @list followed by the output_record_separator to the open object and returns 1 if all data was successfully written.


 
A+,


Message édité par gilou le 17-01-2009 à 11:58:32

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

Marsh Posté le 19-01-2009 à 09:42:46    

Merci beaucoup j'avais pas lu ce passage dans la doc!!
Mais comment faire pour lire le contenue de la variable ou du tableau??? parce que tout ce que j'essaye me renvoie 1...
 
j'espere gilou tu pourras encore m'aider!
merci!!!

Reply

Marsh Posté le 19-01-2009 à 09:42:46   

Reply

Marsh Posté le 19-01-2009 à 19:45:20    

De quelle variable ou quel tableau parles tu ici?
Déja, si tu lisais la doc ca serait une bonne chose!
Tu veux faire quoi?
faire une commande 'show run' et en recuperer le retour?
Eh bien puisque c'est une commande, on utiluse une fonction qui envoie une commande.
C'est pourtant écrit noir sur blanc dans la doc de Net::Telnet

Citation :

cmd - issue command and retrieve output


my @lines = $telnet_session->cmd('show run');
A+,


Message édité par gilou le 19-01-2009 à 20:02:57

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

Marsh Posté le 19-01-2009 à 22:51:58    

je l'ai lu mais c'est en anglais donc je ne comprends pas tous... dsl
Et pour ce qui est de ma question c'est bon j'ai trouver ce midi!
J'ai pas utilisé cette commande moi!!
 
Mais merci quand meme!!

Reply

Marsh Posté le 22-01-2009 à 10:23:36    

Programmer avec une librairie dont on ne comprend pas la doc, c'est plus de la programmation, c'est du vaudou.
A+,


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

Sujets relatifs:

Leave a Replay

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