script pour mettre en forme des requettes snmp

Forum d'assistance et d'échange sur l'installation, la configuration, et l'utilisation des système Linux et BSD. Vous pouvez y poster vos questions concernant ces systèmes d'exploitation en faisant l'effort préalable de rechercher dans le forum, dans les manuels et les documentations que la réponse n'y figure pas.

Modérateur: modos Ixus

script pour mettre en forme des requettes snmp

Messagepar kowalsky » 06 Juil 2005 12:32

Bonjour tout le monde

Je cherche a faire un petit script qui me donnerais les voisins de mes equipements
cisco, en interogeant la MIB snmp relatif au voisin CDP.

voici les commandes tapé

snmpwalk `equihost 100` cisco.ciscoMgmt.ciscoCdpMIB. ciscoCdpMIBObjects.cdpCache. cdpCacheTable.cdpCacheEntry. cdpCacheDeviceId | awk -F "." '{print $9 " "$10}' | awk '{print $1 " " $2 " " $7}'

Recupère les voisins avec le numero de l'interface en snmp

9 1 shoot-land-2924-472
14 1 shoot-land-3640-943
134 1 shoot-land-rsm-220
149 1 shoot-land-2924-104
150 1 shoot-land-2924-105
151 1 shoot-land-2924-106
152 1 shoot-land-2924-107
153 1 shoot-land-2924-108
154 1 shoot-land-2924-109
158 1 shoot-land-3640-943
160 1 shoot-land-3524-1021
161 1 shoot-land-2924-493
162 1 shoot-land-2924-494
163 1 shoot-land-2924-495
164 2 shoot-land-3548-1929
165 1 shoot-land-2950-2443
167 1 shoot-land-2924-2073
168 1 shoot-land-2950-2428
170 1 shoot-land-2950-2441
171 1 shoot-land-2950-2452
246 2 shoot-land-3550-3457
248 2 shoot-aube-4006-1932
248 3 shoot-land-2950-3270
248 4 shoot-land-2651-3606
248 5 shoot-land-2621-1232
249 1 shoot-land-3548-1473


snmpwalk `equihost 100` cisco.ciscoMgmt.ciscoCdpMIB. ciscoCdpMIBObjects. cdpCache.cdpCacheTable. cdpCacheEntry.cdpCacheDevicePort | awk -F "." '{print $9 " "$10}' | awk '{print $1 " " $2 " " $7}'

pareil, mais pour l'interface "distante"

9 1 Ethernet0
14 1 Ethernet0/0
134 1 Vlan1
149 1 FastEthernet0/1
150 1 FastEthernet0/1
151 1 FastEthernet0/1
152 1 FastEthernet0/1
153 1 FastEthernet0/1
154 1 FastEthernet0/1
158 1 Ethernet2/3
160 1 FastEthernet0/23
161 1 FastEthernet0/1
162 1 FastEthernet0/1
163 1 FastEthernet0/1
164 2 FastEthernet0/1
165 1 FastEthernet0/1
167 1 FastEthernet0/1
168 1 FastEthernet0/1
170 1 FastEthernet0/1
171 1 FastEthernet0/1
246 2 FastEthernet0/1
248 2 2/5
248 3 FastEthernet0/24
248 4 FastEthernet0/1
248 5 FastEthernet0/1
249 1 GigabitEthernet0/1


snmpwalk `equihost 100` ifName | awk -F "." '{print $6" "$7}' | awk '{print $1" "$6}'

Et cette commande me recupère la liste avec correspondance entre numero snmp et numero plus "humain"...!

1 sc0
2 sl0
3 VLAN-1
4 VLAN-1002
5 VLAN-1004
6 VLAN-1005
7 VLAN-1003
8 4/1
9 4/2
10 4/3
11 4/4
12 4/5
13 4/6
14 4/7
15 4/8
16 4/9
17 4/10
18 4/11
19 4/12
20 4/13
21 4/14
22 4/15
23 4/16
24 4/17
25 4/18
26 4/19
27 4/20
28 4/21
29 4/22
30 4/23

etc, ça liste donc les ports, même ceux qui ne m'interesse pas...!



Le but serait donc d'arriver à un truc du genre:

4/2 9 1 shoot-land-4700-472 Ethernet0
4/7 14 1 shoot-land-3640-943 Ethernet0/0
3/1 134 1 shoot-land-rsm-101 Vlan1
3/2 149 1 shoot-land-2924-104 FastEthernet0/1
3/3 150 1 shoot-land-2924-105 FastEthernet0/1
3/4 151 1 shoot-land-2924-106 FastEthernet0/1
3/5 152 1 shoot-land-2924-107 FastEthernet0/1
3/6 153 1 shoot-land-2924-108 FastEthernet0/1
3/7 154 1 shoot-land-2924-109 FastEthernet0/1
3/8 158 1 shoot-land-3640-943 Ethernet2/3
3/9 160 1 shoot-land-3524-1021 FastEthernet0/23
3/10 161 1 shoot-land-2924-493 FastEthernet0/1
3/11 162 1 shoot-land-2924-494 FastEthernet0/1
3/14 163 1 shoot-land-2924-495 FastEthernet0/1
3/15 164 2 shoot-land-3548-1929 FastEthernet0/1
3/16 165 1 shoot-land-2950-2443 FastEthernet0/1
3/17 167 1 shoot-land-2924-2073 FastEthernet0/1
3/18 168 1 shoot-land-2950-2428 FastEthernet0/1
3/19 170 1 shoot-land-2950-2441 FastEthernet0/1
3/20 171 1 shoot-land-2950-2452 FastEthernet0/1
3/21 246 2 shoot-land-3550-3457 FastEthernet0/1
3/22 248 2 shoot-aube-4006-1932 2/5
3/23 248 3 shoot-land-2950-3270 FastEthernet0/24
5/6 248 4 shoot-land-2651-3606 FastEthernet0/1
5/7 248 5 shoot-land-2621-1232 FastEthernet0/1
5/8 249 1 shoot-land-3548-1473 GigabitEthernet0/1


je ne vous demande bien sur pas de me le faire hein...!
mais si vous pouviez me mettre sur la voie au moins, sachant que ça
doit etre fait en shell, bash si possible...!!


Merci d'avance...!
kowalsky
Quartier Maître
Quartier Maître
 
Messages: 15
Inscrit le: 15 Déc 2004 00:40

Messagepar Jacques- » 06 Juil 2005 14:54

J'ai du mal à voir le résultat à obtenir à partir des infos fournies...
Si je prends la dernière ligne de résultat, j'ai le port 5/8 que je ne retrouve pas dans les exemples, ensuite la chaine 249 1 et un nom et le 249 que l'on retrouve dans le nom des interfaces.

Si à chaque fois le nombre d'objets à récupérer est le même, que le lien est un numéro présent dans chaque réponse, tu peux créer des tableaux dans le shell et lire chaque tableau en utilisant un indice qui croîtra à chaque fois.
Ou créer 3 fichiers que tu liras avec awk soit en les stockant dans des tableaux pour les exploiter ensuite dans la chaine de sortie finale, ou en lisant fichier par fichier dans une boucle et en écrivant le résultat final dans un fichier.

Genre :
cat /dev/null > FichierSortie
while read Info1 ; do
Info2=`grep $Info1 Fichier2 2>/dev/null`
Info3=`grep $Info1 Fichier3 2>/dev/null`
echo "$Info1 $Info2 $Info3" >> FichierSortie
done < Fichier1

C'est moins propre que les tableaux et on génère plus de commandes shell derrière, mais ça peut suffire si le fichier à traiter n'est pas trop volumineux.
De plus, il est facile d'ignorer des infos dans la chaine de caractère lue, si on ne veut que la première, la seconde et la 4ème par exemple, il suffit de faire read Info1 Info2 Info3 Info4 et d'ignorer Info3. Si il y a moins de variables que de champs, le reste est stocké dans la dernière variable.

Jacques
Avatar de l’utilisateur
Jacques-
Vice-Amiral
Vice-Amiral
 
Messages: 952
Inscrit le: 23 Jan 2003 01:00

Messagepar kowalsky » 06 Juil 2005 15:01

Si je prends la dernière ligne de résultat, j'ai le port 5/8 que je ne retrouve pas dans les exemples, ensuite la chaine 249 1 et un nom et le 249 que l'on retrouve dans le nom des interfaces.


Tout a fait, normalement, dans chaque fichier, les mêmes chiffres correspondront au même information...!

Ou créer 3 fichiers que tu liras avec awk soit en les stockant dans des tableaux pour les exploiter ensuite dans la chaine de sortie finale, ou en lisant fichier par fichier dans une boucle et en écrivant le résultat final dans un fichier.


C'est exactement ce que j'ai fais.


cat /dev/null > FichierSortie
while read Info1 ; do
Info2=`grep $Info1 Fichier2 2>/dev/null`
Info3=`grep $Info1 Fichier3 2>/dev/null`
echo "$Info1 $Info2 $Info3" >> FichierSortie
done < Fichier1


Desolé, j'ai rien compris, Info1 c'est le nom d'un fichier...?

Et pis il y a des colonnes dans mes fichiers... je crois que j'ai pas bien saisi...


Merci en tout cs, j'vais essayer de comprendre un peu plus...!
kowalsky
Quartier Maître
Quartier Maître
 
Messages: 15
Inscrit le: 15 Déc 2004 00:40

Messagepar Jacques- » 07 Juil 2005 10:45

Info1 c'est le nom de la variable qui est utilisée par la commande read.
Comme l'entrée de la variable se fait en lisant le fichier (done < Fichier1) cette variable va prendre à chaque fois le contenu de la ligne qui sera lue.
Et si il y a plusieurs champs dans la ligne, il est possible d'affecter chaque champ dans une variable particulière (voir l'exemple ou le commentaire que j'ai mis après, dans le style : read Info1 Info2 Info3 ; do Commandes; done < Fichier dans ce cas, les 3 champs de la ligne seront mis dans Info1, Info2,Info3 et si il y a plus de 3 champs, la dernière variable contiendra le reste des champs (3 à N).

Voir man bash et chercher read

Jacques
Avatar de l’utilisateur
Jacques-
Vice-Amiral
Vice-Amiral
 
Messages: 952
Inscrit le: 23 Jan 2003 01:00

Messagepar kowalsky » 23 Juil 2005 02:43

merci pour les conseil, en fait j'ai utilisé la commande "join" qui est genial...!!
kowalsky
Quartier Maître
Quartier Maître
 
Messages: 15
Inscrit le: 15 Déc 2004 00:40


Retour vers Linux et BSD (forum généraliste)

Qui est en ligne ?

Utilisateur(s) parcourant actuellement ce forum : Aucun utilisateur inscrit et 1 invité