motivación
hostapd: IEEE 802.11 AP. hostapd: IEEE 802.11
Cuando tenemos a un servicio como hostapd funcionando y si además lo tenemos en Raspberry Pi, es de mucha utilidad, conocer que clientes tenemos activos en cada momento.
Existe un comando muy completo que nos proporciona esta información llamado iw. Este comando proporciona una información muy detallada que en ciertos momentos puede ser de utilidad, aunque no muestra por ejemplo la dirección ip del cliente. Con un sencillo script es posible obtener esta información.
El script que he desarrollado utiliza iw que muestra los clientes conectados. Una vez filtrada la información y cruzada con la salida de arp es posible mostrar la correlación de cliente wifi junto a su ip. Es necesario hacer un ping broadcast para que la tabla arp esté actualizada. También se muestra el “vendor id” (utilizo la API de macvendors.com) de la mac address para tener así una información más amplia.
#!/bin/bash # Muestra los clientes de hostapd activos en un momento dado # Author. Juan José Valera Flores. net_broadcast='192.168.0.255' maclist=`iw dev wlan0 station dump | grep Station | cut -f 2 -s -d' '` wget_file='/tmp/mac.vendor' ping -b -q -c 2 -s 1472 192.168.2.255 > /dev/null 2>&1 for mac in $maclist do wget http://api.macvendors.com/$mac -O $wget_file > /dev/null 2>&1 vendor=`cat $wget_file` rm $wget_file ip=`arp -a | grep $mac | cut -f 2 -d' '` echo $vendor $mac $ip done
Nota. En caso de que el ping broadcast no funcione (depende del sistema que recibe el ping). Sería necesario hacer el ping un poco más artesanal como por ejemplo:
for host_ip in {1..254}; do ping -n -w 1 192.168.2.$host_ip; done
Aunque esto último es bastante lento. Podemos mejorarlo usando la funcion time, pero hay que tener en cuenta que el script será para bash en lugar de sh.
time ( s=$net_ip ; for i in $(seq 1 254) ; do ( ping -n -c 1 -w 1 $s.$i ) & done ; wait ) \ > /dev/null 2>&1