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

Langage Perl Discussion :

[langage] récupérer le contenu d'une commande switch en perl


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 29
    Points : 13
    Points
    13
    Par défaut [langage] récupérer le contenu d'une commande switch en perl
    Bonjour,

    je souhaiterai récupérer le résultat de la commande "sh mac-address-table" d'un switch cisco par un script en perl.
    Le résultat obtenu par cette commande doit être conservée dans un fichier texte.

    si quelqu'un à des idées sur le sujet, j'ai besoin de vos connaissances en perl.

    Merci à vous.


  2. #2
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Le module Net::Telnet::Cisco du CPAN est fait exactement pour cela.

    Je ne l'ai jamais utilisé, mais j'en ai toujours entendu dire le plus grand bien.

    Je te recommande donc de suivre cette piste de plus près et d'aller regarder sa doc surwww.cpan.org. Ensuite, s'il te convient, installe le, et le vrai travail commencera .

    Bon courage.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  3. #3
    Membre actif
    Inscrit en
    Février 2005
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 167
    Points : 203
    Points
    203
    Par défaut
    2EuroCents a une bonne solution, sinon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    my @out = `sh mac-address-table`;
    open OUT, '>', 'mac.out' or die "ne peut ouvrir mac.out en écriture : $!\n";
    print OUT @out;
    close OUT;
     
    # ensuite, libre à toi de faire jou-jou avec @out dans ton script...

  4. #4
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par nematoad
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @out = `sh mac-address-table`;
    Le noeud du problème est là ... "sh mac-address-table" est une commande CISCO-IOS, exécutée localement sur le switch, dans une connexion par telnet.

    On ne peut donc pas demander à Perl de la transmettre à l'OS sous-jacent (Perl ne tourne malheureusement pas sous IOS)

    D'ou l'usage de Net::Telnet::Cisco ... Ce cheminement s'explique par le fait que la commande sh doit être passée au switch dans une connexion telnet, mais aussi parceque les Cisco ont une implémentation un peu spéciale du protocole Telnet et ajoutant un "more" aux sorties ... C'est pour cela qu'un Net::Telnet est insuffisant et qu'il faut le spécialiser en Cisco.

    Bon courage.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    Merci à vous.

    J'ai fait comme tu me l'a suggérer 2Eurocents, j'ai été faire un tour du côté des modules de CPAN. J'ai trouvé le module correspondant à cisco, Net::Telnet::Cisco. Il y a même un exemple d'utilisation, un bout de code pour la connexion et l'exécution de la commande.

    J'ai commencé à faire un petit bout de code, mais pas encore testé.

    Voila, je vous tiendrais au courant.

    Merci encore.

  6. #6
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    J'ai testé la connexion telnet et le module fonctionne très bien.
    Je récupère le résultat de la commande cisco "show mac-adress-table dans un tableau. Je souhaiterai supprimer des éléments du tableau.
    Pourriez-vous m'expliquer comment le faire?

    le tableau que j'obtiens est :
    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
     
     114    000d.61ae.54bd    DYNAMIC     Gi0/1
     114    0010.a706.1c9b    DYNAMIC     Gi0/1
     114    0010.b5e6.b4fb    DYNAMIC     Gi0/1
     114    0010.dc40.5513    DYNAMIC     Gi0/1
     114    0010.dc43.586e    DYNAMIC     Gi0/1
     114    0010.dc43.58a2    DYNAMIC     Gi0/1
     114    0010.dc4a.56b5    DYNAMIC     Gi0/1
     114    0010.dc57.5485    DYNAMIC     Gi0/1
     114    0010.dc78.5c91    DYNAMIC     Gi0/1
     114    0010.dc78.5c95    DYNAMIC     Gi0/1
     114    0010.dc89.57af    DYNAMIC     Gi0/1
     114    0010.dcb0.3e7d    DYNAMIC     Gi0/1
     114    0011.0972.df64    DYNAMIC     Gi0/1
     114    0011.0972.e08a    DYNAMIC     Gi0/1
    et j'aimerais qu'il devienne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     000d.61ae.54bd   Gi0/1
     0010.a706.1c9b    Gi0/1
     0010.b5e6.b4fb    Gi0/1
     0010.dc40.5513    Gi0/1
     0010.dc43.586e    Gi0/1
     0010.dc43.58a2    Gi0/1
     0010.dc4a.56b5    Gi0/1
     ....
    De plus j'aurais 4 lignes à supprimer au début du tableau et 2 lignes en fin du tableau

    j'ai commencé un bout de code, pour faire des essaie sur quelques truc que j'avais trouvé dans des tutoriaux mais ça fonctionne pas.

    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
     
    use strict; 
    use CGI; 
    use Net::Telnet::Cisco; 
     
    #my $IP_Switch;
    my $session = Net::Telnet::Cisco->new(Host => '192.168.10.2',
    					Prompt => '/.*\#/');
    $session->login('truc', 'xxxx');
     
    # Execute la commande
    my @output = $session->cmd('show mac-address-table');
    print @output;
     
    $session->close;
    @output = split;
     
    foreach ($output) {
      chomp;
      $#output = $#output -1;
    }
     
    open ( FichierPort_Mac,">../FPM1_10.131.31.1.txt") ; 
    print FichierPort_Mac @output;
    close (fichierPort_Mac);
     
    print FichierPort_Mac "\n";
    Merci pour vos réponses. [/quote]

  7. #7
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Bonjour,

    Pour passer de ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     114    000d.61ae.54bd    DYNAMIC     Gi0/1
    à cela :J'aurai tendance à passer par un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $a = " 114    000d.61ae.54bd    DYNAMIC     Gi0/1";
    $a =~ s/^\s*//; # J'appelle ça un left-trim. On vire les blancs à gauche.
    $a =~ s/\s*$//; # right-trim - pas réellement nécessaire, ici.
    @liste = split (/\s+/, $a); # Séparation des différents champs
    $a = join (' ', @liste[1,3]); # Rassemblement des champs qui nous intéressent.
    Il est possible de faire les deux dernières opérations au moyen d'une extraction par une expression rationnelle, mais je trouve cette combinaison split/join plus facile à appréhender, et donc à maintenir.


    Citation Envoyé par helene22500
    De plus j'aurais 4 lignes à supprimer au début du tableau et 2 lignes en fin du tableau
    Tel un goret moyen, je proposerai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @tableau = @tableau[4..$#tableau-2];
    où l'on affecte au tableau une tranche de celui ci, commençant au 4e élément et se terminant à celui de rang (nb_element - 2).

    Citation Envoyé par helene22500
    j'ai commencé un bout de code, pour faire des essaie sur quelques truc que j'avais trouvé dans des tutoriaux mais ça fonctionne pas.

    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
     
    use strict; 
    use CGI; 
    use Net::Telnet::Cisco; 
     
    #my $IP_Switch;
    my $session = Net::Telnet::Cisco->new(Host => '192.168.10.2',
    					Prompt => '/.*\#/');
    $session->login('truc', 'xxxx');
     
    # Execute la commande
    my @output = $session->cmd('show mac-address-table');
    print @output;
     
    $session->close;
    @output = split;
     
    foreach ($output) {
      chomp;
      $#output = $#output -1;
    }
     
    open ( FichierPort_Mac,">../FPM1_10.131.31.1.txt") ; 
    print FichierPort_Mac @output;
    close (fichierPort_Mac);
     
    print FichierPort_Mac "\n";
    A première vue, tu as quelques défauts d'algo et de structure de données.
    En effet, tu récupères tes adresses dans @output, mais tu vides cette liste en faisant un split sans arguments (donc implicitement sur $_).
    En outre, le résultat d'un split sur une ligne de @output ne doit pas être stocké dans @output ... ce sont des données de nature différente. Je te recommande donc une autre liste ...

    Bon courage pour la suite.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  8. #8
    Membre actif Avatar de Gamdwin
    Inscrit en
    Avril 2005
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 186
    Points : 207
    Points
    207
    Par défaut
    Pour la première question, personnellement j'aurais fait un truc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while ( <TON_FICHIER> )
    {
       chomp;
     
       # Recupere la seconde et la quatrieme colonne de donnees
       my ($mac, $interface) = m/\d\s+(.*?)\s+\w+\s+(.*?)$/;
    }
    Je propose ceci en alternative possible à la méthode proposée par 2Eurocents.
    La mienne est pas meilleure, chacun voit midi à sa porte.
    Personnellement je trouve l'expression rationnelle plus lisible qu'un split/join, c'est une simple question de goût (dès lors que les principes de lisibilité de base sont respectés, bien sûr ).

    Pour la restriction du tableau, j'aurais fait pareil que 2Eurocents, mais je m'assurerais pour cette méthode que le fichier ne compte pas de ligne vide ou non significatives.
    "I hate quotations. Tell me what you know." (Ralph Waldo Emerson)

  9. #9
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    Merci à vous, avec quelques petites modifs et votre aide le script fonctionne bien.
    Le module Net::Telnet::Cisco est bien pratique.
    J'aurais une petite question: est-il possible d'appeler un script cgi en perl par un autre script cgi?

    Merci encore pour votre aide.

  10. #10
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Bien sûr ! Tu peux rediriger le browser de tes usagers vers ton deuxième script ou même l'appeler par des commandes d'appels systèmes (cf FAQ ).
    N'oublies pas, si c'est OK, le tag Résolu !

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  11. #11
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    Merci pour ta réponse.
    Pourrais-tu m'indiquer où se trouve la fac perl car je ne l'ai pas trouvé.
    Merci à toi.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Lazarus] Récupérer le contenu d'une commande net sh
    Par jpp dans le forum Lazarus
    Réponses: 2
    Dernier message: 09/01/2014, 02h18
  2. mettre contenue d'une commande dans un tableau
    Par parisien91 dans le forum Langage
    Réponses: 8
    Dernier message: 09/02/2009, 10h27
  3. Réponses: 1
    Dernier message: 30/05/2008, 01h00
  4. Réponses: 1
    Dernier message: 14/07/2007, 22h20
  5. Réponses: 2
    Dernier message: 05/10/2004, 22h43

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