A continuación construiré un script para la identificación de dispositivos conectados a una red, con una IP asignada, sin importar si el equipo cuenta con alguna protección (firewall) que impida respuesta a consultas más tradicionales como ping.
El script lo construiré paso a paso, mostrando resultados parciales para una mejor comprensión. Todo script linux inicia con la identificación del interprete que debe utilizarse para la ejecución, de esta forma se pueden tener script de bash o de perl
#!/bin/bash
#!/urs/bin/perl
Para este script se hará uso del comando arping para realizar la consulta de dispositivos conectados, sudo para ejecutar otro comando con privilegios de administrador,grep para filtrado de resultados positivos, awk para mostrar los resultados (y optimizar el script), el blucle for;para la ejecución de la consulta múltiples veces, y echo para mostrar mensajes varios.
Se inicia con la mostrar un mensaje simple (equivalente a un "Hola mundo")
#!/bin/bash echo "Listado de direcciones IP conectadas"
Asumiremos que se hará sobre el rango de direcciones ip entre 192.168.1.1 y 192.168.1.254, por lo que se hará un bucle que nos cambie el valor del cuarto octeto
#!/bin/bash
echo "Listado de direcciones IP conectadas"
for i in {1..254}; do
echo "192.168.1.$i"
done
El comando arping requiere privilegios de administrador, por lo que será precedido por el comando sudo. Los parámetros utilizados con "-c 1", para indicar que se debe hacer un solo intento por cada IP; y "-I <interfaz>", parámetro requerido en todo equipo con más de una interfaz (se puede identificar el nombre de la interfaz con "ip addr")
#!/bin/bash
echo "Listado de direcciones IP conectadas"
for i in {1..254}; do
sudo arping -c 1 192.168.1.$i -I wlp2s0
done
Esta nueva versión del script ya nos mostrará la información que buscamos, identifica las IP que se encuentran activas en la red, pero las que no estén activas, mostrará un error. En el siguiente paso, el script se limitará a mostrar solo los casos en los que encuentre la IP activa. Para esto, utilizaremos el comando grep, para filtrar solo las líneas que contengan el texto "Unicast", así:
#!/bin/bash
echo "Listado de direcciones IP conectadas"
for i in {1..254}; do
sudo arping -c 1 192.168.1.$i -I wlp2s0 | grep "Unicast"
done
En el siguiente paso, podemos mejorar la salida del script, limitando la salida a la dirección IP y la MAC del equipo, utilizando awk, para que muestre el cuarto (IP) y quinto (MAC) campo de la salida completa:
#!/bin/bash
echo "Listado de direcciones IP conectadas"
for i in {1..254}; do
sudo arping -c 1 192.168.1.$i -I wlp2s0 | grep "Unicast" | \
awk '{print $4 " " $5}'
done
Finalmente se puede optimizar el script, utilizando awk para que filtre la salida (que actualmente lo hace grep), reduciendo el uso de un comando.
#!/bin/bash
echo "Listado de direcciones IP conectadas"
for i in {1..254}; do
sudo arping -c 1 192.168.1.$i -I wlp2s0 | awk '/Unicast/{print $4 " " $5}/'
done