lunes, 2 de noviembre de 2009

Averiguando MAC desde IP

En ocasiones nos puede interesar conocer la MAC de una determinada IP de nuestra red, bien para temas de inventario o para saber si alguien se ha cambiado indebidamente su IP.

Este sencillo script nos ayudará a obtener la MAC de la IP indicada como parámetro:

#!/bin/sh
ping -c 1 $1 >/dev/null 2>&1 && arp -n | grep $1 | awk '{print $3}'

Su llamada sería:

$ ./obtener_mac 192.168.1.1
00:13:f7:e9:96:cf

Si quisiéramos realizar un listado completo de IPS-MACS de nuestra red, podríamos adaptar el script de esta forma:

#!/bin/sh

for IP in $(seq 254)
do
  MAC=$(ping -c 1 $1$IP >/dev/null 2>&1 && arp -n | grep "$1$IP " | awk '{print $3}')
  echo $1$IP - $MAC
done

Suponiendo una red de clase C y pasando como parámetro la parte fija de la dirección IP:

$ ./listado_macs 192.168.2.
192.168.2.1 - 00:13:f7:e9:96:cf
192.168.2.2 -
192.168.2.3 -
[.......]

3 comentarios:

  1. Muy bueno el programa.
    Sólo vale para equipos que estén encendidos y tengan conectividad.

    Un saludo.

    ResponderEliminar
  2. Hola, gracias por pasarte por el blog.
    Efectivamente, sirve solo para equipos encendidos. No obstante, se podría hacer un script que en base al listado generado, chequee las IPs para las que no se conoce MAC y realice el ping, arp, etc. Si se encuentra una MAC, con "sed" se podría cambiar la linea del listado correspondiente a esa IP, y actualizar la MAC.

    Saludos

    ResponderEliminar
  3. He corregido un bug que hacía que grep validase las lineas que contienen 192.168.1.1, 192.168.1.11, etc, cuando se llamaba a grep 192.168.1.1.

    La linea corregida era:
    MAC=$(ping -c 1 $1$IP >/dev/null 2>&1 && arp -n | grep $1$IP | awk '{print $3}')

    Y su corrección:
    MAC=$(ping -c 1 $1$IP >/dev/null 2>&1 && arp -n | grep "$1$IP " | awk '{print $3}')

    ResponderEliminar