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

Shell et commandes GNU Discussion :

Script bash qui compte depuis un fichier log le nombre d'arguments x qui 'matchent' n adresse ip données


Sujet :

Shell et commandes GNU

  1. #1
    Membre habitué
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Novembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2017
    Messages : 13
    Par défaut Script bash qui compte depuis un fichier log le nombre d'arguments x qui 'matchent' n adresse ip données
    Bonjour à tous,

    Depuis plusieurs jours je bloque sur un script bash, je débute et je ne suis pas très calé en la matière. Je sollicite donc l'aide des pros qui ont l'habitude et plus d'expertise que moi dans le domaine

    Je vous présente donc ce que j'ai déjà fait et ce sur quoi je bloque :

    1/ J'ai tout d'abord un fichier .txt dans lequel j'ai listé tout bêtement des adresses IP d'équipements réseaux (des Voice Gateway, "VG" de marque Cisco, ce sont des passerelles analogique-numérique en ToIP et servent à brancher des téléphones analogiques ou fax sur une infra IP). Mon fichier s'appelle vglist.txt et ressemble à ce qui suit, c'est sous forme texte brut. (vous pourriez tout à fait imaginer faire la même chose sur un switch en récupérant un autre type de données...)

    10.5.8.23
    10.5.4.171
    10.5.4.34

    2/ Ensuite j'ai un script .sh qui s'appelle "tache1.sh" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/bash
    # demande des mots de passe (il y en a 2 sur les équipements Cisco) :
    echo -n "Quel est le mot de passe ? "
    read -s -e pass
    echo -ne '\n'
    echo -n "Mot de passe ENABLE ? "
    read -s -e enable
    echo -ne '\n'
    # Va aller chercher chaque adresse IP du fichier vglist.txt et executer un script Expect en balançant les mots de passe saisis juste avant (voir ci-après le script Expect en 3/)
    for vg in $(cat vglist.txt);do
     ./programme_vg.exp $vg $pass $enable ;
     done

    3/ Enfin mon script Expect "programme_vg.exp" (Expect ressemble à TCL), il permet d'injecter des commandes Cisco sur les équipements. J'ai mis l'extension .exp mais j'aurais pu aussi mettre .sh

    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
    #!/usr/bin/expect -f
     
    # Variables
     set hostname [lindex $argv 0]
     set pass [lindex $argv 1]
     set enable [lindex $argv 2]
     set timeout 5
     
    # Fichier de sortie pour les resultats
     log_file -a ./resultat.log
     
    # Annonce sur quel équipement on travaille et date-heure
     send_user "\n"
     send_user ">>>>> , $hostname , Date :, [exec date] , <<<<<\n"
     send_user "\n"
     
    # invoque telnet
    spawn telnet $hostname
     
    # Injecte les deux mots de passe
      expect ">"
      send "$pass\n"
        send "en\n"
        expect "Password:"
        send "$enable\n"
     
    # Envoie la commance cisco
    send "sh voice port sum | section incl up\n"
     
    expect "#\r"
    send "exit\n"
    exit
    Vous remarquerez que ce script fait appel à /usr/bin/expect, mais peu importe.
    Donc en lançant tache1.sh j'obtiens l'affichage ci-dessous, enregistré dans un fichier de sortie "resultat.log"


    # vi resultat.log

    >>>>> , 10.5.8.23 , Date :, sam. mars 24 15:12:03 CET 2018 , <<<<<

    spawn telnet 10.5.8.23^M
    Trying 10.5.8.23...^M^M
    Connected to 10.5.8.23.^M^M
    Escape character is '^]'.^M^M
    ^M
    ****************************************************^M
    ^M
    vg-aaa^M
    Unauthorized access to this system is forbidden and will be^M
    prosecuted by law.^M
    ****************************************************^M
    ^M
    ^M
    User Access Verification^M
    ^M
    Password: ^M
    vg-aaa>en^M
    Password: ^M
    vg-aaa#sh voice port sum | section incl up^M
    2/0 -- fxs-ls up dorm on-hook idle y ^M
    2/2 -- fxs-ls up dorm on-hook idle y ^M
    2/5 -- fxs-ls up dorm on-hook idle y ^M
    2/6 -- fxs-ls up dorm on-hook idle y ^M
    2/7 -- fxs-ls up dorm on-hook idle y ^M
    2/8 -- fxs-ls up dorm on-hook idle y ^M
    2/9 -- fxs-ls up dorm on-hook idle y ^M
    2/10 -- fxs-ls up dorm on-hook idle y ^M
    2/11 -- fxs-ls up dorm on-hook idle y ^M
    2/12 -- fxs-ls up dorm on-hook idle y ^M
    2/13 -- fxs-ls up dorm on-hook idle y ^M
    2/14 -- fxs-ls up dorm on-hook idle y ^M
    vg-aaa#
    >>>>> , 10.5.4.171 , Date :, sam. mars 24 15:12:13 CET 2018 , <<<<<

    spawn telnet 10.5.4.171^M
    Trying 10.5.4.171...^M^M
    Connected to 10.5.4.171.^M^M
    Escape character is '^]'.^M^M
    ^M
    ****************************************************^M
    ^M
    vg-bbb^M
    Unauthorized access to this system is forbidden and will be^M
    prosecuted by law.^M
    ****************************************************^M
    ^M
    ^M
    User Access Verification^M
    ^M
    Password: ^M
    vg-bbb>en^M
    Password: ^M
    vg-bbb#sh voice port sum | section incl up^M
    2/1 -- fxs-ls up dorm on-hook idle y ^M
    2/2 -- fxs-ls up dorm on-hook idle y ^M
    2/3 -- fxs-ls up dorm on-hook idle y ^M
    2/4 -- fxs-ls up dorm on-hook idle y ^M
    2/5 -- fxs-ls up dorm on-hook idle y ^M
    2/6 -- fxs-ls up dorm on-hook idle y ^M
    2/7 -- fxs-ls up dorm on-hook idle y ^M
    2/8 -- fxs-ls up dorm on-hook idle y ^M
    2/9 -- fxs-ls up dorm on-hook idle y ^M
    2/11 -- fxs-ls up dorm on-hook idle y ^M
    2/12 -- fxs-ls up dorm on-hook idle y ^M
    2/13 -- fxs-ls up dorm on-hook idle y ^M
    2/14 -- fxs-ls up dorm on-hook idle y ^M
    2/15 -- fxs-ls up dorm on-hook idle y ^M
    2/16 -- fxs-ls up dorm on-hook idle y ^M
    2/17 -- fxs-ls up dorm on-hook idle y ^M
    2/18 -- fxs-ls up dorm on-hook idle y ^M
    2/19 -- fxs-ls up dorm on-hook idle y ^M
    2/20 -- fxs-ls up dorm on-hook idle y ^M
    2/21 -- fxs-ls up dorm on-hook idle y ^M
    2/22 -- fxs-ls up dorm on-hook idle y ^M
    2/23 -- fxs-ls up dorm on-hook idle y ^M
    ^M
    --More--
    >>>>> , 10.5.4.34 , Date :, sam. mars 24 15:12:23 CET 2018 , <<<<<

    spawn telnet 10.5.4.34^M
    Trying 10.5.4.34...^M^M
    Connected to 10.5.4.34.^M^M
    Escape character is '^]'.^M^M
    ^M
    ****************************************************^M
    ^M
    vg-ccc^M
    Unauthorized access to this system is forbidden and will be^M
    prosecuted by law.^M
    ****************************************************^M
    ^M
    ^M
    User Access Verification^M
    ^M
    Password: ^M
    vg-ccc>en^M
    Password: ^M
    vg-ccc#sh voice port sum | section incl up^M
    2/0 -- fxs-ls up dorm on-hook idle y ^M
    2/6 -- fxs-ls up dorm on-hook idle y ^M
    2/11 -- fxs-ls up dorm on-hook idle y ^M
    2/14 -- fxs-ls up dorm on-hook idle y ^M
    2/15 -- fxs-ls up dorm on-hook idle y ^M
    2/16 -- fxs-ls up dorm on-hook idle y ^M
    2/17 -- fxs-ls up dorm on-hook idle y ^M
    2/19 -- fxs-ls up dorm on-hook idle y ^M
    2/20 -- fxs-ls up dorm on-hook idle y ^M
    2/21 -- fxs-ls up dorm on-hook idle y ^M
    2/22 -- fxs-ls up dorm on-hook idle y ^M
    2/23 -- fxs-ls up dorm on-hook idle y ^M
    ^M
    vg-ccc#


    Donc le script envoie la commande sur l'équipement Cisco : show voice port summary | section include up
    ceci me remonte l'information des ports (les lignes 2/0, 2/1, 2/2, etc) qui sont UP uniquement, n'ayant pas besoin de connaitre les ports DOWN, peu importe, sinon on fait show voice port summary et ça liste tous les ports, qu'ils soient UP ou DOWN, mais j'ai voulu réduire l'info dans le log.

    => Ce que je veux c'est savoir sur tel ou tel équipement (=telle adresse IP) combien de ports sont UP

    Du coup, j'ai tous les résultats dans mon fichier log (imaginez un tel fichier avec le résultat du script pour 200 adresses IP...) mais je ne sais pas à l'aide de quelles commandes (combinaison de grep et sed ? cut ? créer un tableau ?) je peux dans un script nommé tache2.sh obtenir ce résultat :

    >>>>> , 10.5.8.23
    ports UP :
    12

    >>>>> , 10.5.4.171
    ports UP :
    22

    >>>>> , 10.5.4.34
    ports UP :
    12

    Je n'ai pas réussi à 'matcher' $vg (donc l'adresse IP) et faire un wc -l des lignes suivantes comprenant "up dorm" (mais uniquement les lignes qui concernent l'équipement donné)

    Tout ce que j'obtiens c'est un count de toutes les chaines "up dorm" du fichier resultat.log, je n'arrive pas à découper par équipement.

    La difficulté à mon avis est que pour chaque adresse IP, le nombre de lignes qui suivent varie... ce n'est pas fixe. Il faudrait pouvoir délimiter des zones de recherche de l'info pour chaque adresse IP, par exemple dire tu regardes de ">>>>> , 10.5." jusqu'au prochain ">>>>> ,"
    et là tu me fais un grep de "up dorm" et tu me fais un wc -l de cette expression, et tu me mets le résultat dans un fichier de sortie autre (que l'on incrémente avec l'information apprise précédemment jusque là).

    J'espère que j'ai été clair, j'imagine que ce que je veux faire est possible, mais je ne sais absolument pas comment, je suis vraiment débutant et je ne me rends pas compte si c'est compliqué à faire ou au contraire assez simple par le maniement de quelques commandes usuelles.

    Si vous avez des idées déjà ?

    Par avance, merci énormément
    Rico

  2. #2
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,



    en clair il s'agit de compter pour chaque IP le nombre de lignes consécutives qui contiennent un truc genre "fxs-ls up" et sachant que le fichier de log en question est en partie au format Windows avec des retours en CRLF

    c'est bien ça ?

    accessoirement, ce que je remarque pour 10.5.4.171 par exemple, c'est qu'on a en plein milieu un -- More -- qui traine, c'est voulu ? on est bien certain qu'il n'y a que 22 ports du coup ?

  3. #3
    Membre habitué
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Novembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2017
    Messages : 13
    Par défaut
    Salut BufferBob,

    Merci pour la réponse rapide !

    Les balises ? mhhh.... va falloir que je cherche ce que c'est et comment mettre ça en place...

    Le fichier de sortie n'est pas au format Windows spécifiquement, c'est juste .txt mais le script tourne sur un serveur Linux, donc j'aurais pu très bien appeler mon fichier vglist sans mettre d'extension.
    C'est juste pour dire que c'est un fichier texte.

    Par contre chaque adresse IP commencera toujours par "10.5.", à partir du 3eme octet ça peut changer.

    le --More-- en plein milieu, ce n'est pas grave. En fait la commande que je lance retournera toujours les ports UP, ils seront toujours à l'affichage de manière certaine, il n'y a que 24 ports, de 2/0 à 2/23.
    Je ne sais pas pourquoi il a enregistré le More, mais justement ça montre que les affichage dans le fichier log peuvent être différents d'un équipement à l'autre.

  4. #4
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    un truc comme ça semble fonctionner :
    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
    #!/usr/bin/awk -f
     
    /Connected/ {
       IP = substr($NF,0,length($NF)-4)
       step = 1
    }
     
    /fxs-ls up/ {
       if (step == 1) { step = 2 }
       if (step == 2) { count++; next; }
    }
     
    step == 2 {
       print IP " : " count
       count = 0; step = 0
    }
    et le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ ./toto.awk
    10.5.8.23 : 12
    10.5.4.171 : 22
    10.5.4.34 : 12
    ---

    Citation Envoyé par Ricochets Voir le message
    Les balises ? mhhh.... va falloir que je cherche ce que c'est et comment mettre ça en place...
    tu vas y arriver, y'a plus compliqué comme pb informatique dans l'éditeur c'est une icône en forme de #

    Le fichier de sortie n'est pas au format Windows spécifiquement, c'est juste .txt mais le script tourne sur un serveur Linux
    .txt c'est une extension, mais les ^M sont caractéristiques de fins de lignes en \r\n (0x0d, 0x0a), tandis que sous Linux les fins de lignes sont uniquement des \n (0x0a), et ton fichier montre les deux, donc à priori c'est un fichier mixte, aussi bien ça ne pose aucun problème particulier, aussi bien on a vu des cas où ça en posait

    Par contre chaque adresse IP commencera toujours par "10.5.", à partir du 3eme octet ça peut changer.
    oui ou sera en fin d'une ligne contenant Connected par exemple, c'est ce sur quoi je me base dans le script

    le --More-- en plein milieu, ce n'est pas grave. En fait la commande que je lance retournera toujours les ports UP, ils seront toujours à l'affichage de manière certaine, il n'y a que 24 ports, de 2/0 à 2/23.
    Je ne sais pas pourquoi il a enregistré le More, mais justement ça montre que les affichage dans le fichier log peuvent être différents d'un équipement à l'autre.
    oui, ça montre surtout que l'affichage attendait en interactif (coucou expect) qu'on appuie sur espace pour afficher le reste, donc là tu as 22 ports affichés, aussi bien il te manque l'affichage des 2 derniers ports et tu ne t'en es pas rendu compte

  5. #5
    Membre habitué
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Novembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2017
    Messages : 13
    Par défaut
    ok c'est super sympa...
    (j'ai compris pour les balises, merci BufferBob je n'avais pas regardé le bandeau éditeur, désolé)

    par contre je ne comprends pas bien ton code.
    Si je copie-colle dans un nouveau fichier, déjà il ne comprend pas (et moi non plus) d'où vient /Connected/,
    (/Connected/ n'existe pas dans mon fichier log)

    il me retourne ça :

    tache2.awk: ligne3: /Connected/: Aucun fichier ou dossier de ce type
    tache2.awk: ligne4: Erreur de syntaxe près du symbole inattendu « ( »
    tache2.awk: ligne4: ` IP = substr($NF,0,length($NF)-4)'



    oui, ça montre surtout que l'affichage attendait en interactif (coucou expect) qu'on appuie sur espace pour afficher le reste, donc là tu as 22 ports affichés,
    aussi bien il te manque l'affichage des 2 derniers ports et tu ne t'en es pas rendu compte
    Tu as surement raison pour l'attente de la touche Espace, mais en l'occurence ici il ne manque rien. et en plus on voit que entre la dernière ligne de port 2/23 (qui est le dernier port de l'équipement) et le --More-- il y a une ligne blanche marquée par ^M.
    Je pense qu'on peut faire abstraction du --More-- et l'ignorer, à priori le commande me retourne le bon résultat à chaque fois.

  6. #6
    Membre habitué
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Novembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2017
    Messages : 13
    Par défaut
    Je précise, je suis sur un serveur Linux
    et fais tourner mes scripts en bash

  7. #7
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Bonjour

    La réponse de BufferBob était trop belle.

    Le shebang, sur la première ligne d'un fichier exécutable, indique le logiciel avec lequel le texte doit être interprété.
    Ici, tu as loupé #!/usr/bin/awk -f qui indique qu'il s'agit d'un script awk.

    Évidemment, si tu demandes à bash d'interpréter awk, ça ne marche pas.
    Tu pourrais, aussi, appeler la commande awk dans ton script bash.
    Mais la solution élégante est celle donnée par BufferBob : écris le script dans un fichier plat que tu nommes mon_compteur_par_ip.awk par exemple. Rends-le exécutable. Puis alimente-le avec ton script principal. Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for vg in $(cat vglist.txt);do
     ./programme_vg.exp $vg $pass $enable ;
     done | mon_compteur_par_ip.awk

  8. #8
    Membre habitué
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Novembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2017
    Messages : 13
    Par défaut
    Salut Flodelarab,

    Le shebang, sur la première ligne d'un fichier exécutable, indique le logiciel avec lequel le texte doit être interprété.
    Oui, oui, je l'ai bien mis dans mon fichier compteur_par_ip.awk (ou l'ancien nom que j'avais donné avant )


    Évidemment, si tu demandes à bash d'interpréter awk, ça ne marche pas.
    ah ok...

    écris le script dans un fichier plat que tu nommes mon_compteur_par_ip.awk par exemple. Rends-le exécutable. Puis alimente-le avec ton script principal.
    C'est ce que j'ai essayé mais ça n'a pas fonctionné. Je suis dans un train maintenant, je ferai un copier-coller de l'erreur tout à l'heure.

  9. #9
    Membre habitué
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Novembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2017
    Messages : 13
    Par défaut
    De ce que j'ai compris le mot "connected" va être le jalon qui divise mon texte brute en plusieurs morceaux et le awk fait le traitement pour chaque "Fxs-ls up" trouvé.
    Comme le programme awk est appelé à chaque boucle For dans mon premier script, ca revient à chercher la variable $vg dans le fichier resultat.log
    C'est ça ?

  10. #10
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Le script awk est appelé une fois pour toute. Pas à chaque boucle.

    Il traite ligne à ligne.

    Tant qu'il ne voit pas la ligne contenant "Connected", il ne fait rien.
    Quand il rencontre cette ligne, il se met à compter les lignes contenant "fxs-ls up".
    Quand ce bloc de lignes est fini, il affiche le résultat et se remet en attente de la prochaine ligne "Connected".

  11. #11
    Membre habitué
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Novembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2017
    Messages : 13
    Par défaut
    Merci pour l'explication très claire
    Je pense que c'est un code qui pourrait me servir à prendre d'autres informations sur d'autres équipement, bien utile en tout cas ! merci les gars !!

    Comme je disais hier, ça ne fonctionnait pas, il me mettais une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [root]# sh tache1.sh 
    Quel est le mot de passe ? 
    Mot de passe ENABLE ? 
    tache1.sh: ligne14: compteur_par_ip.awk : commande introuvable
    Donc j'ai rajouté le point et le slash devant compteur_par_ip.awk car il ne devait pas comprendre où aller chercher ce fichier (après tout l'erreur est toujours entre le dossier de la chaise et le clavier... )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/bash
     
    echo -n "Quel est le mot de passe ? "
    read -s -e pass
    echo -ne '\n'
    echo -n "Mot de passe ENABLE ? "
    read -s -e enable
    echo -ne '\n'
     
    for vg in $(cat vglist.txt);do
     ./programme_vg.exp $vg $pass $enable ;
    done | ./compteur_par_ip.awk
    Mais ça ne fonctionne pas mieux :

    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [root]# sh tache1.sh
    Quel est le mot de passe ? 
    Mot de passe ENABLE ? 
    [root]#
    Il n'affiche plus rien. Les mots de passe ont été injecté, ça a tourné quelques secondes et puis j'ai obtenu le prompt #

    Tous les fichiers sont dans le même répertoire...

    PS : dans le fichier resultat.log il n'y a plus les lignes --More--, (je ne sais pas vraiment pourquoi)

    Une idée ? car moi je sèche...

  12. #12
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Effectivement, tu as bien fait d'indiquer le chemin d'accès.

    A ta place, je chercherais à savoir si c'est mon script qui est mauvais, ou si l'entrée est mauvaise.
    Par exemple, tu peux créer un fichier de traces intermédiaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for vg in $(cat vglist.txt);do
     ./programme_vg.exp $vg $pass $enable ;
    done | tee /tmp/intermediaire.log | ./compteur_par_ip.awk
    Si le fichier /tmp/intermediaire.log ne contient pas l'entrée que tu as indiquée dans le premier message, le problème est là.
    Sinon, c'est le script.

    PS : dans le fichier resultat.log il n'y a plus les lignes --More--, (je ne sais pas vraiment pourquoi)
    C'est normal. De nombreuses commandes ont une présentation pour l'humain et une sortie brute pour la machine et les logs.
    Ou alors, tu as moins de lignes

  13. #13
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    essaye en mettant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for vg in $(cat vglist.txt);do
     ./programme_vg.exp $vg $pass $enable ;
    done
     
    ./compteur_par_ip.awk resultat.log
    c'est à dire finalement ton code de départ, avec juste la dernière ligne en plus et en oubliant pas de spécifier le fichier de log au script awk, de telle façon t'es sûr que si ton script s'exécute normalement le fichier de log est bien nourri et si le log est nourri le script awk doit s'exécuter dessus

    pour le fun une autre version, sans awk, peut-être plus compréhensible :
    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
    # note: avec le grep on filtre pour ne garder que ce qui nous intéresse :
    # - les adresses IP sur les lignes "Connected to ..."
    # - et les lignes "fxs-ls up ..."
    grep -P "Connected to \K.+?(?=\.[^0-9.])|.*fxs-ls up.*" resultat.log | {
       while read line; do
          if [[ "$line" =~ \. ]]; then     # si la ligne contient un point, c'est une IP
             if [[ $prems -eq 0 ]]; then   # si c'est la premiere ligne on affiche rien
                prems=1
             else
                echo "$IP : $count"        # sinon on affiche le bloc qu'on vient de compter
                count=0
             fi
             IP=$line
          else  # si la ligne contient fxs-ls etc. on incremente
             ((count++))
          fi
       done
       echo "$IP : $count"  # on affiche le dernier résultat
    }

  14. #14
    Membre habitué
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Novembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2017
    Messages : 13
    Par défaut
    Flodelarab,

    t'es trop fort... en tout cas merci encore pour l'aide précieuse

    J'ai un problème de connection sur l'équipement,

    Je reviens faire le point après

  15. #15
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    BufferBob a raison. La sortie n'est pas sur la sortie standard mais dans le fichier resultat.log. Il ne faut donc pas traiter la sortie à la volée, mais après.

  16. #16
    Membre habitué
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Novembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2017
    Messages : 13
    Par défaut
    Salut,

    Me revoilà, j'ai eu un souci, perte d'accès distant sur le matériel, du coup je travaille avec 2 nouvelles Voice Gateway dans le bureau.

    Test 1 :

    J'ai donc essayé ça pour mon programme nommé tache1.sh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for vg in $(cat vglist.txt);do
     ./programme_vg.exp $vg $pass $enable ;
    done | tee /tmp/intermediaire.log | ./compteur_par_ip.awk

    Effectivement, ça me remplit intermediaire.log et resultat.log avec ce résultat :
    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
    39
    40
    41
    42
    43
    >>>>> , 10.5.4.100 , Date :, jeu. mars 29 14:36:03 CEST 2018 , <<<<<
     
    spawn telnet 10.5.4.100^M
    Trying 10.5.4.100...^M^M
    Connected to 10.5.4.100.^M^M
    Escape character is '^]'.^M^M
    ^M
    ^M
    User Access Verification^M
    ^M
    Password: ^M
    vg-yyy>en^M
    Password: ^M
    vg-yyy#sh voice port sum | section incl up^M
    2/0             --  fxs-ls      up    dorm on-hook  idle     y ^M
    2/1             --  fxs-ls      up    dorm on-hook  idle     y ^M
    2/2             --  fxs-ls      up    dorm on-hook  idle     y ^M
    2/3             --  fxs-ls      up    dorm on-hook  idle     y ^M
    2/4             --  fxs-ls      up    dorm on-hook  idle     y ^M
    vg-yyy#
    >>>>> , 10.5.4.200 , Date :, jeu. mars 29 14:36:13 CEST 2018 , <<<<<
     
    spawn telnet 10.5.4.200^M
    Trying 10.5.4.200...^M^M
    Connected to 10.5.4.200.^M^M
    Escape character is '^]'.^M^M
    ^M
    ^M
    User Access Verification^M
    ^M
    Password: ^M
    vg-xxx>en^M
    Password: ^M
    vg-xxx#sh voice port sum | section incl up^M
    2/0             --  fxs-ls      up    dorm on-hook  idle     y ^M
    2/1             --  fxs-ls      up    dorm on-hook  idle     y ^M
    2/2             --  fxs-ls      up    dorm on-hook  idle     y ^M
    2/3             --  fxs-ls      up    dorm on-hook  idle     y ^M
    2/4             --  fxs-ls      up    dorm on-hook  idle     y ^M
    2/5             --  fxs-ls      up    dorm on-hook  idle     y ^M
    2/6             --  fxs-ls      up    dorm on-hook  idle     y ^M
    ^M
    vg-xxx#


    Test 2 : en partant du 2eme script que tu proposes sans awk, qui va chercher l'info dans resultat.log

    c'est à dire celui-ci, que j'ai appelé task2.sh :
    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
    #!/bin/bash
     
    grep -P "Connected to \K.+?(?=\.[^0-9.])|.*fxs-ls up.*" resultat.log | {
       while read line; do
          if [[ "$line" =~ \. ]]; then # si contient un point c une IP
             if [[ $prems -eq 0 ]]; then   # si c la premiere ligne on affiche rien
                prems=1
             else
                echo "$IP : $count"    # sinon on affiche le bloc que l'on vient de compter
                count=0
             fi
             IP=$line
          else                 # si la ligne contient 'fxs-ls up'  on incremente
             ((count++))
          fi
       done
       echo "$IP : $count"  # on affiche le dernier resultat
    }

    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # sh task2.sh 
     : nected to 10.3.2.80.
     : 0ected to 10.3.2.229.

    Test 3 : en partant du code de BufferBob :

    qui 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
    #!/bin/bash
     
    echo -n "Quel est le mot de passe ? "
    read -s -e pass
    echo -ne '\n'
    echo -n "Mot de passe ENABLE ? "
    read -s -e enable
    echo -ne '\n'
     
    for vg in $(cat vglist.txt);do
     ./programme_vg.exp $vg $pass $enable ;
    done
     
    ./compteur_par_ip.awk resultat.log

    Pour rappel, on a compteur_par_ip.awk qui ressemble à ça :
    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
    #!/usr/bin/awk -f
     
    /Connected/ {
       IP = substr($NF,0,length($NF)-4)
       step = 1
    }
     
    /fxs-ls up/ {
       if (step == 1) { step = 2 }
       if (step == 2) { count++; next; }
    }
     
    step == 2 {
       print IP " : " count
       count = 0; step = 0
    }

    Résultat :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    # sh tache1.sh 
    Quel est le mot de passe ? 
    Mot de passe ENABLE ? 
     
    >>>>> , 10.5.4.100 , Date :, jeu. mars 29 16:00:04 CEST 2018 , <<<<<
     
    spawn telnet 10.5.4.100
    Trying 10.5.4.100...
    Connected to 10.5.4.100.
    Escape character is '^]'.
     
     
    User Access Verification
     
    Password: 
    vg-yyy>en
    Password: 
    vg-yyy#sh voice port sum | section incl up
    2/0             --  fxs-ls      up    dorm on-hook  idle     y 
    2/1             --  fxs-ls      up    dorm on-hook  idle     y 
    2/2             --  fxs-ls      up    dorm on-hook  idle     y 
    2/3             --  fxs-ls      up    dorm on-hook  idle     y 
    2/4             --  fxs-ls      up    dorm on-hook  idle     y 
    vg-yyy#
    >>>>> , 10.5.4.200 , Date :, jeu. mars 29 16:00:14 CEST 2018 , <<<<<
     
    spawn telnet 10.5.4.200
    Trying 10.5.4.200...
    Connected to 10.5.4.200.
    Escape character is '^]'.
     
     
    User Access Verification
     
    Password: 
    vg-xxx>en
    Password: 
    vg-xxx#sh voice port sum | section incl up
    2/0             --  fxs-ls      up    dorm on-hook  idle     y 
    2/1             --  fxs-ls      up    dorm on-hook  idle     y 
    2/2             --  fxs-ls      up    dorm on-hook  idle     y 
    2/3             --  fxs-ls      up    dorm on-hook  idle     y 
    2/4             --  fxs-ls      up    dorm on-hook  idle     y 
    2/5             --  fxs-ls      up    dorm on-hook  idle     y 
    2/6             --  fxs-ls      up    dorm on-hook  idle     y 
    vg-xxx#
    Ca donne bien ce qu'on cherche..., il n'y a plus les ^M
    merci !!! c'est déjà ça !
    Par contre j'ai l'impression que le prg awk ne fonctionne pas (compteur_par_ip.awk)

    Ensuite, si j'applique mon programme nommé task2.sh :
    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
    #!/bin/bash
     
    grep -P "Connected to \K.+?(?=\.[^0-9.])|.*fxs-ls up.*" resultat.log | {
       while read line; do
          if [[ "$line" =~ \. ]]; then # si contient un point c une IP
             if [[ $prems -eq 0 ]]; then   # si c la premiere ligne on affiche rien
                prems=1
             else
                echo "$IP : $count"    # sinon on affiche le bloc que l'on vient de compter
                count=0
             fi
             IP=$line
          else                 # si la ligne contient 'fxs-ls up'  on incremente
             ((count++))
          fi
       done
       echo "$IP : $count"  # on affiche le dernier resultat
    }

    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # sh task2.sh 
     : nected to 10.3.2.80.
     : 0ected to 10.3.2.229.

    Voili...voilo...

  17. #17
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par Ricochets Voir le message
    Effectivement, ça me remplit intermediaire.log et resultat.log avec ce résultat :
    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
    39
    40
    41
    42
    43
    >>>>> , 10.5.4.100 , Date :, jeu. mars 29 14:36:03 CEST 2018 , <<<<<
     
    spawn telnet 10.5.4.100^M
    Trying 10.5.4.100...^M^M
    Connected to 10.5.4.100.^M^M
    Escape character is '^]'.^M^M
    ^M
    ^M
    User Access Verification^M
    ^M
    Password: ^M
    vg-yyy>en^M
    Password: ^M
    vg-yyy#sh voice port sum | section incl up^M
    2/0             --  fxs-ls      up    dorm on-hook  idle     y ^M
    2/1             --  fxs-ls      up    dorm on-hook  idle     y ^M
    2/2             --  fxs-ls      up    dorm on-hook  idle     y ^M
    2/3             --  fxs-ls      up    dorm on-hook  idle     y ^M
    2/4             --  fxs-ls      up    dorm on-hook  idle     y ^M
    vg-yyy#
    >>>>> , 10.5.4.200 , Date :, jeu. mars 29 14:36:13 CEST 2018 , <<<<<
     
    spawn telnet 10.5.4.200^M
    Trying 10.5.4.200...^M^M
    Connected to 10.5.4.200.^M^M
    Escape character is '^]'.^M^M
    ^M
    ^M
    User Access Verification^M
    ^M
    Password: ^M
    vg-xxx>en^M
    Password: ^M
    vg-xxx#sh voice port sum | section incl up^M
    2/0             --  fxs-ls      up    dorm on-hook  idle     y ^M
    2/1             --  fxs-ls      up    dorm on-hook  idle     y ^M
    2/2             --  fxs-ls      up    dorm on-hook  idle     y ^M
    2/3             --  fxs-ls      up    dorm on-hook  idle     y ^M
    2/4             --  fxs-ls      up    dorm on-hook  idle     y ^M
    2/5             --  fxs-ls      up    dorm on-hook  idle     y ^M
    2/6             --  fxs-ls      up    dorm on-hook  idle     y ^M
    ^M
    vg-xxx#
    on est d'accord que ça correspond pas à ce que tu avais donnée au tout début ?

    j'imagine que t'as essayé de comprendre les codes qu'on te donne, du coup tu as du te rendre compte qu'on cherche à matcher "fxs-ls up" par exemple, alors que dans le log que tu donnes on a à priori "fxs-ls      up", et on sait pas non plus si c'est 6 espaces ou 1 tabulation

    je t'invite à modifier les codes qu'on t'a donné en conséquence, ou à écrire le tiens en te basant sur une logique approchante (on maitrise toujours mieux un code écris par soi-même)

  18. #18
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par Ricochets Voir le message
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # sh task2.sh 
     : nected to 10.3.2.80.
     : 0ected to 10.3.2.229.
    J'ai pas tout lu en détail et, de toute façon, Flodelarab et BufferBob sont nettement plus calés que moi, mais les traces que tu montres me font fortement penser à un problème de fin de ligne.

    Je soupçonne qu'on ait un retour à la ligne, c'est-à-dire un \r qui perturbe la sortie.

    Je t'invite à tester echo -e "Connected to 10.3.2.80.\r : \r\nConnected to 10.3.2.229.\r : 0\r\n" sur une machine unix.

    Afin de vérifier d'où vient le problème, pourrais-tu nous donner le résultat de sh task2.sh | od -c ?

    Le cas échéant, ce pourrait être une bonne idée de traiter d'abord tous les problèmes de fin de ligne (mixte entre des "^M^J" ou "\r\n" (fin de ligne Windoze) et "^J" ou "\n" (fin de ligne linux)) avant le reste...

  19. #19
    Membre habitué
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Novembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2017
    Messages : 13
    Par défaut
    merci à tous les 2, j'essaie tout cela demain !

    Oui j'essaie de comprendre, mais comme je fais d'autres choses à coté aussi, désolé pour l'erreur J'adapterai avec ce "up".

    Encore une fois vous êtes carrément trop fort et merci pour le temps que vous passez sur ce forum !

  20. #20
    Membre habitué
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Novembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2017
    Messages : 13
    Par défaut
    Bonjour !

    BufferBob tu avais raison ! c'était juste le wording dans l'expression qui coinçait.

    Du coup, quand je lance tache1.sh, j'obtiens :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    # sh tache1.sh 
    Quel est le mot de passe ? 
    Mot de passe ENABLE ? 
    
    >>>>> , 10.5.4.100 , Date :, ven. mars 30 09:36:40 CEST 2018 , <<<<<
    
    spawn telnet 10.5.4.100
    Trying 10.5.4.100...
    Connected to 10.5.4.100.
    Escape character is '^]'.
    
    
    User Access Verification
    
    Password: 
    vg-yyy>en
    Password: 
    vg-yyy#sh voice port sum | section incl up
    2/0             --  fxs-ls      up    dorm on-hook  idle     y 
    2/1             --  fxs-ls      up    dorm on-hook  idle     y 
    2/2             --  fxs-ls      up    dorm on-hook  idle     y 
    2/3             --  fxs-ls      up    dorm on-hook  idle     y 
    2/4             --  fxs-ls      up    dorm on-hook  idle     y 
    vg-yyy#
    >>>>> , 10.5.4.200 , Date :, ven. mars 30 09:36:50 CEST 2018 , <<<<<
    
    spawn telnet 10.5.4.200
    Trying 10.5.4.200...
    Connected to 10.5.4.200.
    Escape character is '^]'.
    
    
    User Access Verification
    
    Password: 
    vg-xxx>en
    Password: 
    vg-xxx#sh voice port sum | section incl up
    2/0             --  fxs-ls      up    dorm on-hook  idle     y 
    2/1             --  fxs-ls      up    dorm on-hook  idle     y 
    2/2             --  fxs-ls      up    dorm on-hook  idle     y 
    2/3             --  fxs-ls      up    dorm on-hook  idle     y 
    2/4             --  fxs-ls      up    dorm on-hook  idle     y 
    2/5             --  fxs-ls      up    dorm on-hook  idle     y 
    2/6             --  fxs-ls      up    dorm on-hook  idle     y 
    vg-xxx#10.5.4.1 : 5
    10.5.4.2 : 7

    Donc ça fonctionne !!! franchement encore un grand merci à vous 3 !

    Je n'ai plus qu'à adapter pour que ça me ressorte l'adresse IP en entier .100 et .200 et c'est bon !

    Ce qui est génial aussi c'est que je pourrai adapter ces scripts pour sortir d'autres infos !


+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Batch] commande "bash" dans PuTTY depuis un fichier batch
    Par Hanooman dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 18/07/2012, 20h11
  2. Script - ouvrir des urls depuis un fichier externe
    Par yuyu599 dans le forum Langage
    Réponses: 2
    Dernier message: 09/10/2010, 23h17
  3. Réponses: 21
    Dernier message: 29/09/2005, 19h33
  4. Programme qui analyse un fichier log
    Par abdou.sahraoui dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 20/08/2004, 14h27

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