Bonjour,
Voila un petit script qui a evolué au fil des temps, au début il affichait juste le nombre de pc connecté sur le réseau et les ip correspondantes. (un peu comme les scripts déjà existant sur le forum)
Puis je voulais repérer facilement tout mes pc par rapport aux adresses MAC sans fichiers de configuration supplémentaire.
Puis il est devenu rapide! (enfin c’est relatif), 20sec pour une plage complète (1-254)
Fonctionne très simplement:
- sans aucuns paramètres, il donne la liste complète des pc connectés sur le réseau.(ip + nom_correspondant)
- avec le nom du pc, il va juste afficher l’ip du pc correspondant.
Parametre à modifier:
- PING_DEVICE (le périphérique a utiliser: wlan0, eth0 etc… (ifconfig))
- une liste de vos pc connecté sur votre réseau à modifier directement dans le script
- normalement c’est tout …
Donc voila le résultat:
-lancer le une première fois en modifiant juste le $PING_DEVICE, et vous aurez une liste avec l’ip et l’adresse MAC correspondante pour chaque pc connecté.
-modifier la liste suivant l’exemple déjà ecrit.
#!/bin/bash
# version 0.5
#Ping options
PING="/bin/ping"
PING_NUMBER=1
PING_TIMEOUT=1 #pour gagner un peu en vitesse
PING_DEVICE=eth-station #Device
# get the prefix of the network broadcast address ie: 192.168.1
IP_PREFIX=`ifconfig |awk '/Bcast:/ { sub("Bcast*:","") ; sub(".255","") ; print $3 }'`
#Locale stuff ... récupère l'ip du pc
IP_LOCAL=`ifconfig -a $PING_DEVICE | awk '/inet adr/ { sub("adr:","") ; print $2 }'`
#Variables importante.
PROCESS_MAX=40 #Process simultanné maximum (Après 50 process j'obtiens des erreurs)
PROCESS_FINALE=254 #Nombre Maximum de process a executer (entre 1 et 254)(boucle total)
PROCESS_NUMBER=1 #Nombre de process en cours (Valeur a ne pas modifier)
PROCESS_CURRENT=0 #Nombre de process lancé au total (Valeur a ne pas modifier)
#Modifier/ajouter autant de pc que vous voulez!
case $@ in
1-box ) MAC="aa:bb:cc:dd:ee:ff" ;;
2-box ) MAC="aa:bb:cc:dd:ee:ff" ;;
3-box ) MAC="aa:bb:cc:dd:ee:ff" ;;
whatyouwant-box ) MAC="aa:bb:cc:dd:ee:ff" ;;
* ) ALL=true ;;
esac
function get_ip(){
if [ "$PROCESS_CURRENT" -lt "$PROCESS_FINALE" ]; then
PING=`"$PING" -c$PING_NUMBER -w$PING_TIMEOUT $IP_PREFIX.$PROCESS_CURRENT`
fi
}
function get_process(){
PROCESS_NUMBER=`ps ux|grep -v grep|grep "$PING"|wc -l`
}
function get_mac() {
MAC_ADDRESS=`arp -i$PING_DEVICE -a $IP_PREFIX.$IP | awk '{ print $4 }'`
if [ "$MAC_ADDRESS" == "<incomplete>" ]; then
NAME_MAC="null"
elif [ "$MAC_ADDRESS" == "trouvée" ]; then #Bad trick ...
if [ "$IP_LOCAL" == "$IP_PREFIX.$IP" ]; then
NAME_MAC=`hostname`
else
NAME_MAC="null"
fi
else
NAME_MAC=`awk '/'"$MAC_ADDRESS"'/ { print $1 }' $0` #Donne le nom par rapport au programme lancé
if [ "$NAME_MAC" == "" ]; then
NAME_MAC="$MAC_ADDRESS"
fi
fi
}
#Histoire de remplir la liste arp de facon plus rapide qu'une simple boucle for
while [ "$PROCESS_NUMBER" -ne 5 ] || [ "$PROCESS_CURRENT" -lt 10 ] || [ "$PROCESS_CURRENT" -lt "$PROCESS_FINALE" ]; do
PROCESS_CURRENT=$(( $PROCESS_CURRENT + 1 ))
if [ "$PROCESS_NUMBER" -lt "$PROCESS_MAX" ]; then
get_ip &
else
sleep 0.1s
fi
get_process
#echo $PROCESS_NUMBER $PROCESS_CURRENT
done
#Finale Arp
for IP in `seq 1 $PROCESS_FINALE`;do
get_mac
if [ "$ALL" == "true" ]; then
if [ "$NAME_MAC" != "null" ]; then
echo $IP_PREFIX.$IP $NAME_MAC
fi
elif [ "$NAME_MAC" == "$1" ]; then
echo $IP_PREFIX.$IP
exit 0
fi
done
Voila le resultat obtenu sur mon pc (testé avec une debian et une fedora)
time ip_network [~]
192.168.1.1 livebox
192.168.1.2 photosmart
192.168.1.14 LogikPC
192.168.1.15 lenovo_y310_3945
192.168.1.16 DS409
192.168.1.40 alix_wan
ip_network 3,05s user 7,42s system 48% cpu 21,508 total