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