Voici un script qui dans un premier temps lit des adresses mac dans un fichier, puis fait deux requêtes, l'une donne le numéro de port, avec une adresse en décimal, l'autre donne l'addresse en hexadécimal.
Je voudrai l'adresse mac en hexa et le numéro de port qui va avec; dans un premier temps la réalisation du script aprés quelques testes amener toujours le même nombres de ligne dans les deux requêtes et la ligne un de la première requête était en corrélation avec la ligne un de la deuxième reqûete .
Une fois le programme réalisé et presque mis en production un soucis est survenus (chose apparemment courante), parfois il n'y pas le même nombres de lignes j'ai donc le droit à une erreur et certainement que tout est faussé.
Donc l'idée est de comparer soit comparer le debut de chaque ligne des deux fichiers est ne l'afficher que si ce sont bien les mêmes. Ou mais alors là je ne vois pas du tout et ne sais pas du tout si c'est réalisable convertir dans chaque ligne l'adresse décimal en héxa, ce qui ne fairai qu'utiliser qu'une requête est éviterai les erreurs lors de l'éxecution.
Place aux éléments concret :
les deux fichiers aprés requêtes une requête :
extrait fichier1 héxa et déci
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.169.136.214 "00 00 48 A9 88 D6 "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.171.21.223 "00 00 48 AB 15 DF "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.171.21.243 "00 00 48 AB 15 F3 "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.173.87.1 "00 00 48 AD 57 01 "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.173.87.67 "00 00 48 AD 57 43 "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.173.87.74 "00 00 48 AD 57 4A "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.173.87.83 "00 00 48 AD 57 53 "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.173.88.7 "00 00 48 AD 58 07 "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.173.88.54 "00 00 48 AD 58 36 "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.173.88.181 "00 00 48 AD 58 B5 "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.173.88.253 "00 00 48 AD 58 FD "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.173.89.126 "00 00 48 AD 59 7E "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.173.90.3 "00 00 48 AD 5A 03 "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.180.49.16 "00 00 48 B4 31 10 "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.180.50.12 "00 00 48 B4 32 0C "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.180.50.41 "00 00 48 B4 32 29 "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.180.50.47 "00 00 48 B4 32 2F "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.183.133.169 "00 00 48 B7 85 A9 "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.72.183.136.10 "00 00 48 B7 88 0A "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.0.116.128.32.28 "00 00 74 80 20 1C "
SNMPv2-SMI::mib-2.17.4.3.1.1.0.1.3.16.165.239 "00 01 03 10 A5 EF "
extrait fichier2 port ad déci :
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.169.136.214 25
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.171.21.223 25
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.171.21.243 25
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.173.87.1 25
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.173.87.67 25
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.173.87.74 25
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.173.87.83 25
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.173.88.7 25
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.173.88.54 25
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.173.88.181 25
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.173.88.253 25
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.173.89.126 25
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.173.90.3 25
SNMPv2-SMI::mib-2.17.4.3.1.2.0.0.72.180.49.16 25
Le programme qui devient une usine à gaz :
#On en deduit le nombre de switch
nb_switchs=$i
#On efface les (ex) logs
if [ -f result.txt ]; then
rm result.txt
fi
rm repd.txt
rm reph.txt
rm repdcf1.txt
rm rephcf1.txt
touch repd.txt
touch reph.txt
touch result.txt
#
#
for switch in `seq 1 $nb_switchs`
do
#On recupere l'ip du switch
ip_switch=${ip[$switch]}
echo "switch $ip_switch"
#On recupere les reponses des 2 questions (changer les oids suivant votre equipements!!)
snmpwalk -c public -v 2c $ip_switch .1.3.6.1.2.1.17.4.3.1.2.0 >> repd.txt
snmpwalk -c public -v 2c $ip_switch .1.3.6.1.2.1.17.4.3.1.1 >> reph.txt
sleep 1
cut -d' ' -f1 repd.txt >> repdf1.txt
cut -d' ' -f1 reph.txt >> rephf1.txt
#On remplace l'espace entre le num de port et ce qui precede par deux espaces.
sed 's/ / /g' -i repd.txt
#cmp [ repdf1.txt -ne rephf1.txt ]; then
#echo "il y a probleme reexecution du script dans quelque instant"
#./port_mac4.sh
#else
#On lit le fichier repd.txt
#Traitement des donnees recuperation ports puis adresses mac
i=1
while read ligne
do
port[$i]=${ligne: -3}
i=`expr $i + 1`
done < repd.txt
#On lit le fichier reph.txt
i=1
while read ligne
do
mac[$i]=${ligne: -19}
mac_tmp=${mac[$i]}
mac[$i]=${mac_tmp:0:17}
i=`expr $i + 1`
done < reph.txt
nb_entrees=`expr $i - 1`
#On parcours le tableau des ports afin d'eviter le spanning tree
for i in `seq 1 $nb_entrees`
do
port_affiche[$i]=1
for j in `seq 1 $nb_entrees`
do
if [ $j -ne $i ]; then
tmp_port1=${port[$j]}
echo "port1:$tmp_port1"
tmp_port2=${port[$i]}
echo "port2:$tmp_port2"
if [ $tmp_port1 -eq $tmp_port2 ]; then
port_affiche[$i]=0
fi
fi
done
done
#On affiche les ports etant unique les reponses seront dans result.txt
for i in `seq 1 $nb_entrees`
do
affiche=${port_affiche[$i]}
if [ $affiche -eq 1 ]; then
NPort=`expr ${port[$i]} % 32`
BS=`expr ${port[$i]} / 32`
TBS=`expr $BS + 1`
echo "BS : $TBS Port : $NPort IP Port en serie : ${port[$i]} switch : $ip_switch MAC : ${mac[$i]}" >> result.
txt
fi
done
#fi
done
Les deux cut -d' ' -f1 repd.txt; vont me permettre de récupérer les deux premières parties qui m'intérresse, juste aprés je pensais faire une boucle qui puisse vérifier si sur chaqu'une des lignes les caractères corespondent et en faire dépendre l'affichage finale, ne pas utiliser les informations si elles différent ....
enfin je suis totalement perdu si quelqu'un peut éclaircir le problème ce serait vraiment génial.
Merci ...
# .
Posté par Toto . Évalué à 2.
Un ti script pour t'aider :)
#!/bin/bash
echo $((0x$1)).$((0x$2)).$((0x$3)).$((0x$4)).$((0x$5)).$((0x$6))
et ensuite, ca te donne ca quand tu l'appelles :
./hex2dec 00 00 48 A9 88 D6
0.0.72.169.136.214
Reste plus qu'a simplifier drastiquement ton code et ne lire que le fichier 2 pour obtenir ce que tu souhaites :)
[^] # Re: .
Posté par sdk . Évalué à 1.
Mais je crois qu'il faudrait plutôt l'inverse ;) un convertisseur décimal >> hexa
Je ne souhaite pas du tout conserver l'adresse en décimal, d'ailleur une adresse mac en décimal c'est pas trés parlant, les requêtes snmp sont parfois trés étranges.
[^] # Re: .
Posté par Toto . Évalué à 2.
Dans ce cas la, faut voir du coté de printf :
printf "%.2X\n" 192
C0
Ce qui donnerait (version qui me vient à l'esprit, y a surement plus joli)
printf "%.2X %.2X %.2X %.2X %.2X %.2X\n" $(echo '0.0.72.169.136.214' | sed -e "s/\./ /g")
00 00 48 A9 88 D6
[^] # Re: .
Posté par sdk . Évalué à 1.
Merci bien je regarderai pour la version deux vue que ca m'embête de tout refaire je cherche quand même dans un premier temps à comparer ligne à ligne et à poursuivre le suite que s'il elles correspondent bien.
En tout cas merci je ne connaissai pas du tout cette utilisation de printf ainsi que le passage hexa >> decimal ;)
# Utiliser les outils existants
Posté par JJD . Évalué à 2.
Tu peux aussi essayer d'éviter l'usine à gaz en utilisant ce qui existe déjà.
Bon, on va supposer que le fichier MAC contient les adresses MAC et que le fichier PORT contient les ports. Tu devrais alors pouvoir avoir à peu près ce que tu veux en trois lignes :
cut -d. -f9-12 MAC | sort >MAC.sort
cut -d. -f9-12 PORT | sort >PORT.sort
join MAC.sort PORT.sort
Ça devrait te cracher, avec les exemples que tu donnes, quelque chose du genre :
72.169.136.214 "00 00 48 A9 88 D6 " 25
72.171.21.223 "00 00 48 AB 15 DF " 25
72.171.21.243 "00 00 48 AB 15 F3 " 25
72.173.87.1 "00 00 48 AD 57 01 " 25
72.173.87.67 "00 00 48 AD 57 43 " 25
72.173.87.74 "00 00 48 AD 57 4A " 25
72.173.87.83 "00 00 48 AD 57 53 " 25
72.173.88.181 "00 00 48 AD 58 B5 " 25
72.173.88.253 "00 00 48 AD 58 FD " 25
72.173.88.54 "00 00 48 AD 58 36 " 25
72.173.88.7 "00 00 48 AD 58 07 " 25
72.173.89.126 "00 00 48 AD 59 7E " 25
72.173.90.3 "00 00 48 AD 5A 03 " 25
72.180.49.16 "00 00 48 B4 31 10 " 25
avec, donc, l'adresse en décimal, l'adresse en hexa et le port.
A+
JJD
[^] # Re: Utiliser les outils existants
Posté par Toto . Évalué à 2.
Un truc du genre :
selectioner un champs dans une ligne -> cut
selectioner une ligner suivant un pattern -> grep
...
Un truc généraliste, sans toutes les possibilités des commandes, mais qui permette de savoir ce qu'il est possible de faire sans avoir à rechercher sur tout internet avec une faible probabilité de trouver la bonne commande ?
Car mon gros problème quand je fais un script, c'est que je réinvente souvent la roue, ne connaissant pas l'outil XXX (exemple, je faisait des sed au lieu de cut...)
[^] # Re: Utiliser les outils existants
Posté par jiyuu . Évalué à 2.
http://zero202.free.fr/cs2-elem/html/index.html
D'ailleurs le site en lui meme est une petite mine d'information sur linux mais pas que.
[^] # Re: Utiliser les outils existants
Posté par sdk . Évalué à 1.
Hum je m'en sort pas en voulant travailler avec des élements simple : je ne veus pas réecrire le script avec les élements ci dessus, quoi je le fairais certainement pour la version finale mais là j'aimerai continuer sur ma lancer le problème c'est que juste pour extraire et comparer si le début de chaine (fichier1) correspond bien au début de chaine fichiers 2 je fais un truc plus que lourd est qui ne fonctionne pas :
#!/bin/sh
i=1
while read ligne; do
i=`expr $i + 1`
debutd[$i]=$ligne
done < fich.txt
nb_lignd=$i
echo "$i"
j=1
while read ligne; do
j=`expr $j + 1`
debuth[$j]=$ligne
done < ficd.txt
nb_lignh=$j
echo "$j"
for lign in `seq 1 $nb_lignd`
do
default_affiche[$i]=1
gg=${debutd[$lign]}
echo "$gg"
for lig in `seq 1 $nb_lignh`
do
verifh=${debuth[$lig]}
echo "$verifh"
if [ ${debuth[$lig]} -ne ${debutd[$lign]} ]; then
default_affiche[$lign]=0
else
if [ ${debuth[$lig]} -eq ${debutd[$lign]} ]; then
tmp_addeci=${addeci[$lign]}
tmp_addecih=${addeci[$lig]}
fi
fi
done
for lign in `seq 1 $nb_lignd`
do
affiche1=${default_affiche[$i]}
if [ $affiche -eq 1 ]; then
echo"${tmp_addeci[$lign]}"
fi
done
done
Et même si cela fonctionné je l'imagine mal dans mon usine à gaz en début car là ce serai une usine miné.
Donc je pense qu'une fois extrait (chaque début de ligne) dans les deux différents fichiers : je fais quelquechose du type
cmp repdf1.txt rephf1.txt > fichierx.txt
je pense que cela va comparer les deux fichiers et mettre la différence dans le fichierx puis j'aimerai reprendre le contenu de fichierx (chaque ligne) et les supprimer de repdf1 et rephf1, le problème c'est que je ne vois pas comment faire. ...
:-/
[^] # Re: Utiliser les outils existants
Posté par sdk . Évalué à 1.
Bon piste qui est peut etre à laisser tombé.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.