Python: obtenga la dirección MAC de la NIC local conectada

El objective es recostackr la dirección MAC de la NIC local conectada, no una lista de todas las NIC locales 🙂

Al usar socket y connect (to_a_website) , solo puedo usar getsockname() para obtener la IP, que se usa para conectarse a Internet.

Pero desde la IP, ¿cómo puedo obtener la dirección MAC de la NIC local?

La razón principal de la pregunta es si hay varias NIC.

No puede recuperar la dirección MAC de una IP externa.

Consulte las discusiones sobre cómo obtener la dirección MAC de IP externa en C # para obtener más información.

Utilizar el módulo de netifaces . También está en PyPI para que pueda instalarlo a través de easy_install o pip .

Como vartec sugirió que las netifaces deberían funcionar bien para ir desde IP-> iface:

  import netifaces as nif def mac_for_ip(ip): 'Returns a list of MACs for interfaces that have given IP, returns None if not found' for i in nif.interfaces(): addrs = nif.ifaddresses(i) try: if_mac = addrs[nif.AF_LINK][0]['addr'] if_ip = addrs[nif.AF_INET][0]['addr'] except IndexError, KeyError: #ignore ifaces that dont have MAC or IP if_mac = if_ip = None if if_ip == ip: return if_mac return None 

Pruebas:

  >>> mac_for_ip('169.254.90.191') '2c:41:38:0a:94:8b' 

Una forma primitiva de hacer esto sería utilizar las herramientas de línea de comandos disponibles en su sistema operativo. Ejecute la herramienta utilizando el módulo de subprocess (no os.system() !), os.system() el resultado y analícelo.

En Windows, el comando que desea es ipconfig /all .

En la mayoría de los Unices, incluidos Linux, OSX y BSD, es ifconfig .

Puede haber una mejor manera de hacer esto sin pagar una utilidad de línea de comandos, pero no lo sé … todavía .

Ejemplo de salida de ipconfig /all en Windows XP:

 D:\Documents and Settings\LAYip>ipconfig /all Windows IP Configuration Host Name . . . . . . . . . . . . :  Primary Dns Suffix . . . . . . . :  Node Type . . . . . . . . . . . . : Hybrid IP Routing Enabled. . . . . . . . : No WINS Proxy Enabled. . . . . . . . : No DNS Suffix Search List. . . . . . :   Ethernet adapter Local Area Connection: Connection-specific DNS Suffix . :  Description . . . . . . . . . . . : Intel(R) 82579LM Gigabit Network Con nection #2 Physical Address. . . . . . . . . : 5C-26-0A-60-8D-C7 Dhcp Enabled. . . . . . . . . . . : Yes Autoconfiguration Enabled . . . . : Yes IP Address. . . . . . . . . . . . : xxx.xxx.28.29 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : xxx.xxx.28.254 DHCP Server . . . . . . . . . . . : xxx.xxx.23.13 DNS Servers . . . . . . . . . . . : xxx.xxx.23.13 xxx.xxx.23.11 Lease Obtained. . . . . . . . . . : Thursday, 12 April 2012 9:14:41 AM Lease Expires . . . . . . . . . . : Friday, 20 April 2012 9:14:41 AM Ethernet adapter VirtualBox Host-Only Network: Connection-specific DNS Suffix . : Description . . . . . . . . . . . : VirtualBox Host-Only Ethernet Adapter Physical Address. . . . . . . . . : 08-00-27-00-28-E6 Dhcp Enabled. . . . . . . . . . . : No IP Address. . . . . . . . . . . . : 192.168.56.1 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 

Salida de ifconfig bajo Linux:

 lws@helios:~$ ifconfig eth0 Link encap:Ethernet HWaddr 00:25:22:db:8c:b6 inet addr:10.1.1.2 Bcast:10.1.1.255 Mask:255.255.255.0 inet6 addr: fe80::225:22ff:fedb:8cb6/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:322333 errors:0 dropped:0 overruns:0 frame:0 TX packets:296952 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:40005876 (40.0 MB) TX bytes:162343969 (162.3 MB) Interrupt:40 Base address:0x4000 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:362 errors:0 dropped:0 overruns:0 frame:0 TX packets:362 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:31806 (31.8 KB) TX bytes:31806 (31.8 KB) 

No puede capturar la dirección mac desde un socket. Necesita un marco Ethernet , que se puede encontrar en la capa más baja de la cadena de procesamiento de TCP. Para hacerlo, debe monitorear (capturar) el tráfico de su red. Busque algunos paquetes analizando los paquetes. encabezamiento. y extraer la información requerida, como la dirección mac de la misma.

Este es un intervalo de código útil , que puede ayudarte a hacerlo.

Otra forma indirecta de obtener una identificación de mac de sistemas es usar el comando ping para hacer ping al nombre del sistema y luego realizar una solicitud arp -a en contra de la dirección IP a la que se hizo ping. la desventaja de hacerlo de esa manera es necesario escribir la respuesta de ping en la memoria de python y realizar una operación de línea de lectura para recuperar la dirección IP y luego escribir los datos de arp correspondientes en la memoria mientras escribe el nombre del sistema, la dirección IP y ID de mac para la máquina en cuestión para la pantalla o para un archivo de prueba.

Estoy tratando de hacer algo similar como una verificación de verificación del sistema para mejorar la automatización de un procedimiento de prueba y el script está en python por el momento.