J’ai écrit un petit script bash pour interroger des clients pour savoir si un daemon (collectd) est activé sur eux.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
ip="10 11 12 20 30 32 34 35 36 37 38 39"
ip="$ip 40 41 42 43 44 45 46 47 48 49"
ip="$ip 50 51 52 53 54 55 56 57 58 59"
for i in $ip; do
RESULT=$(snmpget -v2c -d -D ALL -c public 192.168.2.$i .1.3.6.1.4.1.28097.10.9.1.0 | tail -1)
sleep 1
if [ "$RESULT" == "iso.3.6.1.4.1.28097.10.9.1.0 = INTEGER: 2" ]; then
echo COLLECTD ACTIVATED IN $i
else
echo NOT ACTIVATED IN $i
fi
done
exit
Comme vous le voyez c’est assez simple, j’ai une liste d’adresses IP que je parcoure dans une boucle for. Dans la boucle for, je fais un snmpget
avec l’OID du daemon qui spécifie si dernier est activé ou désactivé, à fin, j’extraie la dernière ligne qui contient le retour de snmpget
et je fais des conditions.
Commades utilisées
- tail -1 : extrait la derniere ligne d’un fichier
- snmpget : lire la MIB sur le produit et renvoyer l’information qui correspondent à l’OID.
- -v2c : utiliser la version 2 de snmp
- -d : dump les packets I/O en hexadecimal
- -D ALL : mode debug extrem verbosity
- -c public : community string, c’est un peux comme un ID ou un password pour permettre l’accés au informations du client.
- adresse ip & OID
Mais alors ou est le soucis ?
Le soucis est que ce programme rentre dans la condition if [...]
que dans la dernière itération de la boucle ! c’est à dire ip=59
La cause de ça est que snmpget
pollue les sortie stderr
avec des messages et provoque ça, en redirigeant la sortie stderr
vers stdout
ou vers un fichier, ça résout le soucis.
1
RESULT=$(snmpget -v2c -d -D ALL -c public 192.168.2.$i .1.3.6.1.4.1.28097.10.9.1.0 2>&1 | tail -1)
- 2 : descripteur de fichier pour
stderr
- 1 : descripteur de fichier pour
stdout
- ’>’ oprateur de redirection.
- & spécifie qu’on redirige la sortie vers un descripteur de fichier.
Voila voila, c'etait chiant !
Redirection shell
1
2
3
4
2>&1 : sterr to stdout
&> /Dev/NULL: les deux