Saltar al contenido

Obtenga la dirección MAC de los dispositivos que usan Python

Solución:

Responder la pregunta con Python depende de su plataforma. No tengo Windows a mano, por lo que la siguiente solución funciona en la caja de Linux en la que la escribí. Un pequeño cambio en la expresión regular hará que funcione en OS X.

Primero, debe hacer ping al objetivo. Eso colocará el objetivo, siempre que esté dentro de su máscara de red, que parece que estará en esta situación, en la caché ARP de su sistema. Observar:

13:40 [email protected]% ping 97.107.138.15
PING 97.107.138.15 (97.107.138.15) 56(84) bytes of data.
64 bytes from 97.107.138.15: icmp_seq=1 ttl=64 time=1.25 ms
^C

13:40 [email protected]% arp -n 97.107.138.15
Address                  HWtype  HWaddress           Flags Mask            Iface
97.107.138.15            ether   fe:fd:61:6b:8a:0f   C                     eth0

Sabiendo eso, hace un poco de magia de subproceso; de lo contrario, está escribiendo el código de verificación de caché ARP usted mismo y no quiere hacer eso:

>>> from subprocess import Popen, PIPE
>>> import re
>>> IP = "1.2.3.4"

>>> # do_ping(IP)
>>> # The time between ping and arp check must be small, as ARP may not cache long

>>> pid = Popen(["arp", "-n", IP], stdout=PIPE)
>>> s = pid.communicate()[0]
>>> mac = re.search(r"(([a-fd]{1,2}:){5}[a-fd]{1,2})", s).groups()[0]
>>> mac
"fe:fd:61:6b:8a:0f"

No hace mucho tiempo hubo una pregunta similar en este sitio. Como se menciona en la respuesta elegida por el autor de esa pregunta, Python no tiene una forma incorporada de hacerlo. Debe llamar a un comando del sistema como arp para obtener información ARP o generar sus propios paquetes usando Scapy.

Editar: Un ejemplo usando Scapy de su sitio web:

Aquí hay otra herramienta que monitoreará constantemente todas las interfaces en una máquina e imprimirá todas las solicitudes ARP que vea, incluso en marcos 802.11 desde una tarjeta Wi-Fi en modo monitor. Tenga en cuenta el parámetro store = 0 para sniff () para evitar almacenar todos los paquetes en la memoria a cambio de nada.

#! /usr/bin/env python
from scapy import *

def arp_monitor_callback(pkt):
    if ARP in pkt and pkt[ARP].op in (1,2): #who-has or is-at
        return pkt.sprintf("%ARP.hwsrc% %ARP.psrc%")

sniff(prn=arp_monitor_callback, filter="arp", store=0)

También puede hacer algo similar a la respuesta verificada. Ver https://scapy.readthedocs.io/en/latest/routing.html

>>> mac = getmacbyip("10.0.0.1")
>>> mac
'f3:ae:5e:76:31:9b'

Esto es completamente multiplataforma.

No es exactamente lo que estás buscando, pero definitivamente estás en el camino correcto. ¡Disfrutar!

¿Suena como si quisiera monitorear los falsificadores de ARP? En este caso, todo lo que necesita es arpwatch, disponible en todas las distribuciones de Linux bien suministradas cerca de usted. Descargue las fuentes aquí: http://ee.lbl.gov/

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *