Raspberry Pi,  Servicios,  Wifi

Obtener listado de clientes de hostapd

hostapd
hostapd

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

 

Deja una respuesta