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 :

envoyer cmd sur switch cisco et traiter resultat


Sujet :

Programmation et administration système Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 17
    Par défaut envoyer cmd sur switch cisco et traiter resultat
    Bonjour,

    je cherche à faire un script qui se connecte à un switch, envoie une commande, récupère le résultat et le traite afin d'en ressortir certaines infos.
    Je suis sous windows, avec perl v5.16

    Pour l'instant, mon script utilise le module Net::Telnet::Cisco, se connecte au switch, et lance la commande suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    show interfaces | include Ethernet.*line protocol is
    Ce qui me retourne un résultat du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    FastEthernet0/1 is down, line protocol is down (notconnect)
    FastEthernet0/2 is down, line protocol is down (notconnect)
    FastEthernet0/3 is up, line protocol is up (connected)
    FastEthernet0/4 is down, line protocol is down (notconnect)
    FastEthernet0/5 is up, line protocol is up (connected)
    FastEthernet0/6 is down, line protocol is down (notconnect)
    FastEthernet0/7 is up, line protocol is up (connected)
    FastEthernet0/8 is down, line protocol is down (notconnect)
    FastEthernet0/9 is down, line protocol is down (notconnect)
    FastEthernet0/10 is down, line protocol is down (notconnect)
    FastEthernet0/11 is up, line protocol is up (connected)
    Maintenant, ce que je souhaiterai faire, c'est lire ce résultat ligne par ligne, et remonter une alerte (un simple printf avec le nom de l'interface) si quelque part il y a un état err-disabled ou une interface qui est connected mais down. Ce genre de chose.

    J'ai un peu parcouru ce topic qui semble faire exactement ce que je souhaite. Ca m'a bien aidé pour la connexion mais la méthode pour lire et traiter le résultat m'échappe complétement.

    J'espère ne pas vous avoir perdu en route, je reste à disposition pour plus d'information.

    Merci d'avance =)

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    tu récupères ce résultat dans quoi? Dans une variable?

    Si oui, tu peux splitter la variable sur début de ligne pour obtenir un tableau de lignes, puis examiner chaque ligne une à une pour voir si elle contient ce que tu recherches. Quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my @lignes = split /^/, $resultat;
    while (defined ($_ = shift @lignes)) {
         print "ERR: $_ \n" if /err-disabled/;
    }

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Et pourquoi ne pas utiliser SNMP, c'est prévu pour (d'autant plus que je suis presque sur qu'il y a un module SNMP dans perl) ?

    Se connecter à un équipement pour récupérer périodiquement le statut des interfaces me parait un peut brutal
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 17
    Par défaut
    @Lolo78 : Merci, je vais éssayer ta méthode. Je débute en Perl donc ca va me prendre un certain temps avoir d'avoir le résultat attendu je pense ^^

    @ram-0000 : En faite j'avais aussi pensé à utiliser SNMP et un logiciel comme Nagios pour la supervision des switchs mais à la fin des tests je dois obtenir un petit compte rendu clair de l'état du réseau que même quelqu'un qui n'est pas informaticien doit comprendre. Donc je voulais commencer par faire un script perl pour récupérer les infos et les "mettre en page" à ma convenance.
    Mon responsable craint que Nagios soit un peu comme Ciscoworks LMS, c'est à dire trop "uzine à gaz" dans lequel on ne voit pas forcément l'éssentiel.

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Bonjour,

    tu récupères ce résultat dans quoi? Dans une variable?

    Si oui, tu peux splitter la variable sur début de ligne pour obtenir un tableau de lignes, puis examiner chaque ligne une à une pour voir si elle contient ce que tu recherches. Quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my @lignes = split /^/, $resultat;
    while (defined ($_ = shift @lignes)) {
         print "ERR: $_ \n" if /err-disabled/;
    }
    Le handle de fichier plaqué sur une variable au lieu d'un vrai fichier et aussi une solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    open my $RESULTAT, "<", \$resultat;
    while (<$RESULTAT>) {
       # ...
    }
    Le handle se comporte comme si on lisait dans un vrai fichier, et $/ est le séparateur de ligne. Ca marque aussi en écriture. ;)

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 17
    Par défaut
    Bon j'ai un peu de mal à obtenir ce que je souhaite. En faite je ne comprend pas vraiment vos morceaux de code.


    Pour être plus précis, mon script envoi cette commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @output = $session->cmd('show interfaces | include Ethernet.*line protocol is');
    La commande :

    m'affiche ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    FastEthernet0/1 is down, line protocol is down (notconnect)
    FastEthernet0/2 is down, line protocol is down (notconnect)
    FastEthernet0/3 is up, line protocol is up (connected)
    FastEthernet0/4 is down, line protocol is down (notconnect)
    FastEthernet0/5 is up, line protocol is up (connected)
    FastEthernet0/6 is down, line protocol is down (notconnect)
    FastEthernet0/7 is up, line protocol is up (connected)
    FastEthernet0/8 is down, line protocol is down (notconnect)
    FastEthernet0/9 is down, line protocol is down (notconnect)
    FastEthernet0/10 is down, line protocol is down (notconnect)
    FastEthernet0/11 is up, line protocol is up (connected)
    Ensuite il faudrait que je récupère (par exemple) "FastEthernet0/9" si quelque part sur la ligne qui traite de cette information, se trouve le mot err-disabled.

    Je pense que vous aviez compris mais c'est moi qui ne comprend pas vos codes xD.

    j'ai testé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my @lignes = split(/^/, @output); 
    while (defined ($_ = shift @lignes)) {
         print "ERR: $_ \n" if /connected/;
    }
    avec comme vous le voyez une recherche sur /connected/ pour être sur de ressortir au moins un résultat, mais rien ne s'affiche lorsque j'éxécute ce code.

    La première étape je pense, est de découper mon @output en ligne, de rechercher avec une expression régulière le mot err-disabled, puis de retourner dans une variable le nom de l'interface.

    En faite, j'aimerai savoir comment passé une expression régulière sur mon @output. je crois que c'est plus prudent de commencer petit quand on ne connait pas trop.

    Merci pour votre patience en tout cas ^^

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 158
    Par défaut
    bonjour cureuil57 . Je suis entrain d'écrire un script qui devra faire la même chose que le tien, mais il me retourne le resultat 1 aulieu de me retourner la liste des voisins .

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    !/usr/bin/perl
    use Net::Telnet;
    $telnet = new Net::Telnet ( Timeout=>10,Errmode=>'die');
    $telnet->open('10.10.10.10');
    $telnet->waitfor('/Username: $/i');
    $telnet->print('user');
    $telnet->waitfor('/password: $/i');
    $telnet->print('MDP');
    #$telnet->waitfor('/router1#/i');
    $telnet->waitfor('/#$/i');
    $telnet->print('show cdp neighbors');
    $output = $telnet->waitfor('/#$/i');
    print $output;
    Peut tu m'aider à résoudre cela stp ?

    NB: J'ai posté la même question sur un nouveau sujet si tu prefére me répondre laba

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Citation Envoyé par cureuil57 Voir le message
    Ensuite il faudrait que je récupère (par exemple) "FastEthernet0/9" si quelque part sur la ligne qui traite de cette information, se trouve le mot err-disabled.
    Je pense que si tu remplaces ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my @lignes = split(/^/, @output); 
    while (defined ($_ = shift @lignes)) {
         print "ERR: $_ \n" if /connected/;
    }
    par cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    foreach (@output) {
         print "ERR: $_ \n" if /err-disabled/;
    }
    C'est à dire que tu affiches chaque ligne qui contient "err-disabled".

  9. #9
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Le split était utile si tu récupérais le résultat dans une variable scalaire, pour transformer celle-ci en tableau. Là tu récupères directement dans le tableau @output, le split n'est plus utile; il suffit de vérifier chaque élément du tableau comme Philou te l'as montré avec la construction utilisant le foreach.

Discussions similaires

  1. Problème connexion en ssh sur Switch CISCO
    Par Maykin dans le forum Modules
    Réponses: 2
    Dernier message: 18/04/2011, 12h00
  2. Telnet sur des switchs Cisco
    Par developpeur99 dans le forum Langage
    Réponses: 1
    Dernier message: 14/10/2010, 21h35
  3. Perte du lien réseau sur le port d'une switch Cisco
    Par annedeblois dans le forum Hardware
    Réponses: 5
    Dernier message: 30/07/2010, 18h11
  4. Spanning Tree sur switch cisco catalyst 3525 : pvst et IEEE
    Par klkklk dans le forum Développement
    Réponses: 0
    Dernier message: 06/10/2008, 14h13
  5. Réponses: 3
    Dernier message: 05/03/2007, 15h02

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