Je reposte l'utilisation du script:
-Modifier la ligne pour correspondre avec votre carte réseau:
PING_DEVICE=eth0 #Device (ifconfig -a)
-Lancer le script une première fois sans arguments, histoire de récupérer les adresses MAC sur votre réseau.
-Modifier le script une seconde fois pour qu'il corresponde a votre réseau, avec toute les adresses mac de votre réseau.
Code:
case $@ in
nomdelamachine_facilearetenir ) MAC="08:00:27:89:3d:fe" ;;
autremachinedureseau ) MAC="aa:bb:cc:dd:ee:ff" ;;
....
....
* ) ALL=true ;;
esac
-deux facons de lancer le programme:
\sans aucuns argument pour avoir une liste de tout les pc connecté sur le réseau.
\avec comme argument le nomdelamachine_facilearetenir, et vous aurez comme resultat simplement l'ip du pc
- Et Puis c'est tout

Code:
#!/bin/bash
# version 1-finale ?
# Script permettant de lister tout les pc sur un réseau par rapport à leurs adresses MAC
# Ou permettant de retrouver l'IP d'un PC par rapport a l'adresse MAC
#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
IFCONFIG="/sbin/ifconfig"
if [ -x "$IFCONFIG" ]; then
IP_PREFIX=`$IFCONFIG |awk '/Bcast:/ { sub("Bcast*:","") ; sub(".255","") ; print $3 }'`
IP_LOCALE=`$IFCONFIG -a $PING_DEVICE | awk '/inet adr/ { sub("adr:","") ; print $2 }'`
else
IP_PREFIX="192.168.1"
IP_LOCALE="127.0.0.1"
fi
#Variables importante.
PROCESS_MAX=30 #Process simultanné maximum (Après 50 process j'obtiens des erreurs)
PROCESS_FINAL=254 #Nombre Maximum de process a executer (entre 1 et 254)(boucle)
PROCESS_NUMBER=1 #Nombre de process executé (Valeur a ne pas modifier)
PROCESS_CURRENT=0 #Nombre de process en cours (Valeur a ne pas modifier)
PROCESS_PS_MAX=5 #Petit Hack pour ne pas trop utiliser `ps ux`
PROCESS_PS=$PROCESS_PS_MAX #Memoire :D
#Rajouter/modifier les adresses MAC pour correspondre a votre réseau
case $@ in
windowsxp_virt ) MAC="08:00:27:89:3d:fe" ;;
* ) ALL=true ;;
esac
function get_ip(){
if [ "$PROCESS_CURRENT" -lt "$PROCESS_FINAL" ]; then
PING=`"$PING" -c$PING_NUMBER -w$PING_TIMEOUT $IP_PREFIX.$PROCESS_CURRENT`
fi
}
function get_process(){
PROCESS_PS=$(( $PROCESS_PS - 1 ))
if [ "$PROCESS_PS" -le 0 ]; then
PROCESS_NUMBER=`ps ux|grep "$PING"|wc -l`
if [ "$PROCESS_CURRENT" -lt "$PROCESS_FINAL" ]; then
PROCESS_PS=$PROCESS_PS_MAX
else
PROCESS_PS=$(( $PROCESS_PS_MAX + $PROCESS_PS_MAX ))
wait
fi
fi
}
function get_mac(){
NAME_MAC=`awk '/'"$MAC"'/ { print $1 }' $0`
NAME_IP=`cat /proc/net/arp | awk '! /00:00:00:00:00:00/ && /'$MAC'/ { print $1 }'`
}
#Histoire de remplir la liste arp de facon plus rapide qu'une simple boucle for
while [ "$PROCESS_NUMBER" -gt 3 ] || [ "$PROCESS_CURRENT" -lt 20 ] || [ "$PROCESS_CURRENT" -lt "$PROCESS_FINAL" ]; do
if [ "$PROCESS_NUMBER" -lt "$PROCESS_MAX" ]; then
PROCESS_CURRENT=$(( $PROCESS_CURRENT + 1 ))
get_ip &
else
sleep 0.1s
fi
get_process
#echo $PROCESS_NUMBER $PROCESS_CURRENT
done
#Finale Arp
MAC_ALIVE=`cat /proc/net/arp | awk '! /00:00:00:00:00:00/ && ! /IP address/ { print $4 }'`
if [ "$1" == "" ]; then #HORRIBLE hack pour afficher l'adresse du scanneur
echo $IP_LOCALE `hostname`
fi
for MAC in $MAC_ALIVE; do
get_mac
if [ "$ALL" == "true" ]; then
if [ "$NAME_MAC" == "" ]; then
NAME_MAC=$MAC
fi
echo $NAME_IP $NAME_MAC
else
if [ "$1" == "$NAME_MAC" ]; then
echo $NAME_IP
exit 0
fi
fi
done
J'espère ne pas avoir trop polué le post
