with socket programming network español create book python network-programming

socket - Buscar host con dirección MAC usando Python



socket python 3 (9)

Depende de tu plataforma. Si está utilizando * nix, puede usar el comando ''arp'' para buscar la dirección MAC para una dirección IP dada (asumiendo IPv4). Si eso no funciona, puede hacer ping a la dirección y luego mirar, o si tiene acceso a la red sin procesar (usando BPF o algún otro mecanismo), puede enviar sus propios paquetes ARP (pero eso probablemente sea excesivo).

Me gustaría buscar una dirección MAC dada en mi red, todo desde una secuencia de comandos de Python. Ya tengo un mapa de todas las direcciones IP activas en la red, pero no puedo encontrar la forma de extraer la dirección MAC. ¿Algunas ideas?


Le conviene analizar la salida de ''arp'', pero la memoria caché ARP del kernel solo contendrá esas direcciones IP si esos hosts se han comunicado con el host donde se ejecuta la secuencia de comandos de Python.

ifconfig se puede usar para mostrar las direcciones MAC de las interfaces locales, pero no las de la LAN.


Mark Pilgrim describe cómo hacer esto en Windows para la máquina actual con el módulo de Netbios aquí . Puede obtener el módulo Netbios como parte del paquete Win32 disponible en python.org. Lamentablemente, en este momento no puedo encontrar los documentos en el módulo.


Necesitas ARP . La biblioteca estándar de Python no incluye ningún código para eso, por lo que necesita llamar a un programa externo (su sistema operativo puede tener una utilidad ''arp'') o necesita construir los paquetes usted mismo (posiblemente con una herramienta como Scapy) .


No creo que haya una forma integrada de obtenerlo de Python.

Mi pregunta es, ¿cómo está obteniendo la información IP de su red?

Para obtenerlo de su máquina local, podría analizar ifconfig (unix) o ipconfig (windows) con poca dificultad.


Parece que no hay una forma nativa de hacer esto con Python. Su mejor opción sería analizar la salida de "ipconfig / all" en Windows, o "ifconfig" en Linux. Considere usar os.popen () con algunas expresiones regulares.


como Python no estaba destinado a tratar problemas específicos del sistema operativo (se supone que debe ser interpretado y multiplataforma), ejecutaría un comando externo para hacerlo:

en Unix el comando es ifconfig

si lo ejecuta como una tubería obtendrá el resultado deseado:

import os myPipe = os.popen2("/sbin/ifconfig","a") print(myPipe[1].read())


Este artículo , "Enviar marcos Ethernet hechos a mano en Python (ARP, por ejemplo)", parece ser exactamente lo que estás buscando.


Si desea una solución de Python pura, puede echar un vistazo a Scapy para crear paquetes (debe enviar una solicitud de ARP e inspeccionar las respuestas). O si no le molesta invocar un programa externo, puede usar arping (en sistemas Un * x, no conozco un equivalente de Windows).