IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation et administration système Perl Discussion :

[ Noob - Perl Reseau ] Script perl qui recupere les tables ARP des switches Cisco


Sujet :

Programmation et administration système Perl

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut [ Noob - Perl Reseau ] Script perl qui recupere les tables ARP des switches Cisco
    Bonjour à tous,

    Je suis en train d'écrire un script Perl qui récupère la table ARP des mes switches Cisco 2950 (une 30 ene).

    Le but de la manoeuvre est de retrouver le port du switch sur lequel serait connectée une machine... ou plus simplement savoir où est connecté telle ou telle machine (ou inversement quelle machine est connecté sur tel switch).

    Ces informations sont situés dans la table ARP des switches.
    Pour cela, il est necessaire de se connecter sur chacun des switches et de recupérer le resultat de la commande suivante : "show mac-address-table | exclude CPU"

    Voici le tableau obtenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    #sh mac-address-table
               Mac Address Table
    -------------------------------------------
     
    Vlan    Mac Address       Type        Ports
    ----    -----------       --------    -----
     All    0013.19a4.25c0    STATIC      CPU
     All    0100.0ccc.cccc    STATIC      CPU
     All    0100.0ccc.cccd    STATIC      CPU
     All    0100.0cdd.dddd    STATIC      CPU
       1    0002.5519.8bb4    DYNAMIC     Fa0/23
       1    0006.1bc3.4463    DYNAMIC     Fa0/19
       1    0006.1bc3.e2f2    DYNAMIC     Fa0/12
       1    0006.1bc3.f40f    DYNAMIC     Fa0/11
       1    0006.1bdf.2978    DYNAMIC     Fa0/16
       1    0006.1bdf.3c42    DYNAMIC     Fa0/20
       1    000c.f1ab.5de6    DYNAMIC     Gi0/2
       1    000d.6143.7ad7    DYNAMIC     Fa0/5
       1    000d.6146.8672    DYNAMIC     Fa0/2
       1    000e.0c4f.52ec    DYNAMIC     Gi0/2
       1    000e.a668.a7bb    DYNAMIC     Fa0/6
       1    00d0.cf03.8494    DYNAMIC     Gi0/2
    Total Mac Addresses for this criterion: 16

    Je souhaiterais récupéré que les colonnes Mac Address et Port
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    0002.5519.8bb4    Fa0/23
    0006.1bc3.4463    Fa0/19
    0006.1bc3.e2f2     Fa0/12
    0006.1bc3.f40f     Fa0/11
    0006.1bdf.2978    Fa0/16
    0006.1bdf.3c42    Fa0/20
    000c.f1ab.5de6    Gi0/2
    000d.6143.7ad7   Fa0/5
    000d.6146.8672   Fa0/2
    000e.0c4f.52ec    Gi0/2
    000e.a668.a7bb   Fa0/6
    00d0.cf03.8494    Gi0/2
    Cela ne fais pas 24H que j'ai commencé à apprendre le language perl (donc ne soyez pas trop indulgent), mais je sais qu'il faut que j'utilise la fonction Perl "use Net::Telnet::Cisco;" pour me connecter au switch.

    Voici le bout de script que j'ai écris... un petit coup de main serait le bien venu, car c'est pas gagné (perl me l'a bien fais comprendre quand je lance le script).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #!/usr/bin/perl
    use strict; 
    use Net::Telnet::Cisco; 
     
    my $IP_Switch;
    my $session = Net::Telnet::Cisco->new(Host => '192.168.1.1',
    					Prompt => '/.*\#/');
    $session->login('admin', 'turlututu');
     
    # Execute la commande
    my @output = $session->cmd('show mac-address-table | exclude CPU');
     
    # Sauvegarde dans un fichier
     
    # Variable des fichiers
    $fic_mac_temp_brut = "macport_brut.tmp" ;
    $fic_mac_temp_propre = "macport_propre.tmp" ;
     
    # Ouverture en lecture/ecriture du $fic_mac_temp_brut
    open (Point-Fic-Mac-Brut, $fic_mac_temp_brut) or die ("Impossible d'ouvrir $fic_mac_temp_brut") ;
     
    # Remplissage du fichier $fic_mac_temp_avt_modif avec le contenu de @output
    print Point-Fic-Mac-Brut $output;
     
    # Ouverture en lecture/ecriture du $fic_mac_temp_propre
    open (Point-Fic-Mac-Propre, $fic_mac_temp_propre) or die ("Impossible d'ouvrir $fic_mac_temp_propre") ;
     
    # Remplissage du fichier $fic_mac_temp_propre à partir des infos de $fic_mac_temp_brut; on récupère l'adresse MAC et le port pour chaque ligne
    $nbve = 0 ;
         while ($ligne=<Point-Fic-Mac-Brut>) {
           $nbve++ ;
           chop($ligne) ;
           $ligne =~ s/^\s*//; # supression des blancs à gauche.
           $ligne =~ s/\s*$//; # suppression des blancs à droite
           @liste = split (/\s+/, $ligne); # Séparation des différents champs
           $ligne = join (' ', @liste[1,3]); # Rassemblement des champs qui nous intéressent.
           print Point-Fic-Mac-Propre @ligne; 
             } ; # fin de tant que
    Ce script se connecte dans un premier temps au switch.
    Il lance la commande sh mac-address-table.
    Le résultat de la commande alimente le fichier macport_brut.tmp.
    Ce fichier est ensuite épuré et alimente le fichier macport_propre.tmp.

    Voilà, ce que j'ai essayé de faire... mais visiblement, il y a des fautes...


    Une fois que cela fonctionnera pour un switch, je ferais les modifs pour que cela fonctionne pour une liste de switch... et ensuite intégrer mes infos dans une base MySQL... mais c'est pas pour tout de suite.

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    A priori tout a l'air correct... jusqu'à # sauvegarde blabla.
    Après tu ne déclares plus tes variables, tu utilises des noms de Handle avec des "-" dedans (tu n'aurais pas fait un peu trop de Lisp ? Il n'y a pas beaucoup d'autres langages qui autorisent les "-" dans les identifiants) et tu confonds @output et $output (ce n'est pas la même variable, les deux peuvent cohabiter sans problème dans un même programme, enfin si on fait abstraction de la lisibilité...) ou @ligne et $ligne !

    Une version probablement plus correcte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #!/usr/bin/perl
    use strict; use warnings;
    use Net::Telnet::Cisco; 
     
    my $IP_Switch;
    my $session = Net::Telnet::Cisco->new(Host => '192.168.1.1',
    					Prompt => '/.*\#/');
    $session->login('admin', 'turlututu');
     
    # Execute la commande
    my @output = $session->cmd('show mac-address-table | exclude CPU');
     
    # Sauvegarde dans un fichier
     
    # Variable des fichiers
    my $clean_mac_filename = "macport_propre.tmp";
     
    # Ouverture en __écriture__ du fichier de MAC final
    open my($clean_mac_file), '>', $clean_mac_filename
      or die "Impossible d'ouvrir $clean_mac_filename : $!\n";
     
    # Remplissage du fichier MAC à partir de @output
    foreach ( @output ) {
      chomp;
      if ( m/\w{4}\.\w{4}\.\w{4}/ ) { # si la ligne contient une adresse
        print {$clean_mac_file} join(' ',(split)[1,3]);
      }
    }
    close $clean_mac_file;
     
    __END__
    --
    Jedaï

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/09/2007, 12h32
  2. Réponses: 3
    Dernier message: 11/05/2006, 17h30
  3. Script perl RESEAU
    Par calimero642 dans le forum Programmation et administration système
    Réponses: 36
    Dernier message: 15/03/2006, 09h37
  4. script perl dans script perl et retour derreur..
    Par kiza dans le forum Langage
    Réponses: 7
    Dernier message: 02/12/2005, 15h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo