Siéntete libre de compartir nuestra página y códigos en tus redes, necesitamos tu ayuda para hacer crecer nuestra comunidad.
Solución:
Responder a la pregunta con Python depende de su plataforma. No tengo Windows a mano, por lo que la siguiente solución funciona en el cuadro de Linux en el que lo 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, lo que parece en esta situación, en el 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, haces un poco de magia de subproceso; de lo contrario, estás escribiendo el código de verificación de caché ARP tú mismo, y no quieres 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"
Hubo una pregunta similar respondida no hace mucho tiempo en este sitio. Como se menciona en la respuesta elegida por el autor de esa pregunta, Python no tiene una forma integrada 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 para 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 podría hacer algo similar a la respuesta verificada. Consulte 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 en el camino correcto. ¡Disfrutar!
¿Parece que quieres monitorear a los suplantadores de ARP? En este caso, todo lo que necesita es arpwatch, disponible en todas las distribuciones de Linux bien provistas cerca de usted. Descargue las fuentes aquí: http://ee.lbl.gov/
Valoraciones y comentarios
Si estás contento con lo expuesto, tienes el poder dejar una reseña acerca de qué te ha parecido este ensayo.