NEW CODE !!! (enfin en parti)
- rapide! (15sec pour une plage complete (0-254))
- peu être lancé en tant que simple utilisateur.
- Bug: Maintenant la boucle des ping s’arrete tout le temps.
ps: si quelqu’un a le courage de changer tout les ‘cat|awk|grep|wc’ avec leurs chemins complets du style /bin/cat.
Perso je n’en vois pas trop l’utilité.
#!/bin/bash
# version 0.7
#Ping options
PING="/bin/ping"
PING_NUMBER=1
PING_TIMEOUT=3 #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="192.168.1.1"
fi
#Variables importante.
PROCESS_MAX=35 #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)
case $@ in
exemple ) MAC="aa:bb:cc:dd:ee:ff" ;;
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_NUMBER=`ps ux|grep -v grep|grep "$PING"|wc -l`
}
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" -lt 2 ] || [ "$PROCESS_CURRENT" -lt 10 ] || [ "$PROCESS_CURRENT" -lt "$(( $PROCESS_FINAL + 20 ))" ]; 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
MAC_ALIVE=`cat /proc/net/arp | awk '! /00:00:00:00:00:00/ && ! /IP address/ { print $4 }'`
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
echo $NAME_IP
exit 0
fi
done