subnetting netaddr ipaddress examples python ip-address mac-address

netaddr - Obtener la dirección MAC de dispositivos usando Python



python netaddr examples (8)

Estoy buscando una forma (con python) para obtener la dirección de capa II de un dispositivo en mi red local. Las direcciones de la capa III son conocidas.

El objetivo es crear una secuencia de comandos que sondee una base de datos de direcciones IP a intervalos regulares asegurando que las direcciones mac no hayan cambiado y, si lo han hecho, me envíen alertas por correo electrónico.


¿Suena como que quieres monitorear los spoofers 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/


En algunos aspectos de Linux, se pierde la línea de comandos util "arp". Una imagen de entorno embebido en base yocto linux, por ejemplo.

Una forma alternativa sin la herramienta "arp" sería leer y analizar el archivo / proc / net / arp:

root@raspberrypi:~# cat /proc/net/arp IP address HW type Flags HW address Mask Device 192.168.1.1 0x1 0x2 xx:xx:xx:xx:xx:xx * wlan0 192.168.1.33 0x1 0x2 yy:yy:yy:yy:yy:yy * wlan0


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

Edición: Un ejemplo usando Scapy de su sitio web :

Aquí hay otra herramienta que controlará 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)

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


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

Primero, debes hacer ping al objetivo. Eso colocará al objetivo, siempre que esté dentro de su máscara de red, lo que suena como en esta situación, en la memoria caché ARP de su sistema. Observar:

13:40 jsmith@undertow% 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 jsmith@undertow% 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, usted mismo está escribiendo el código de comprobación de caché ARP y no desea hacerlo:

>>> 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-f/d]{1,2}/:){5}[a-f/d]{1,2})", s).groups()[0] >>> mac "fe:fd:61:6b:8a:0f"


Trate de usar los espacios en red que se encuentran aquí. netifaces


Una forma más fácil, si en linux:

print os.system(''arp -n '' + str(remoteIP))

conseguirás:

Address HWtype HWaddress Flags Mask Iface 192.168..... ether 9B:39:15:f2:45:51 C wlan0


Una solución simple que usa scapy para escanear la subred 192.168.0.0/24 es la siguiente:

from scapy.all import * ans,unans = arping("192.168.0.0/24", verbose=0) for s,r in ans: print("{} {}".format(r[Ether].src,s[ARP].pdst))


para sistemas basados ​​en Unix:

#!/usr/bin/env python2.7 import re import subprocess arp_out =subprocess.check_output([''arp'',''-lan'']) re.findall(r"((/w{2,2}/:{0,1}){6})",arp_out)

Volverá lista de tuplas con macs. scapy es una herramienta increíble, pero parece ser una exageración para este caso