socket real programming network español book all python networking ethernet

real - socket python 3



Python: obtenga la dirección MAC de solo la NIC local conectada (6)

Esta pregunta ya tiene una respuesta aquí:

El objetivo es recopilar la dirección MAC de la NIC local conectada, no una lista de todos los NIC locales :)

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

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

La razón principal de la pregunta es si hay múltiples NIC.


No se puede capturar la dirección MAC desde un socket. Necesitamos un frame ethernet , que se puede encontrar en la capa más baja de la cadena de procesamiento de tcp. Para hacer eso, necesita monitorear (capturar) el tráfico de su red, encontrar algunos paquetes analizando el paquete encabezamiento. y extrae la información requerida, como la dirección MAC de ella.

este es un lapso de código útil , que puede ayudarte a hacer eso.


Una forma primitiva de hacer esto sería usar 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() la salida y analícela.

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 forma mejor de hacerlo sin desembolsar una utilidad de línea de comandos, pero todavía no lo sé ...

Ejemplo de salida de ipconfig /all en Windows XP:

D:/Documents and Settings/LAYip>ipconfig /all Windows IP Configuration Host Name . . . . . . . . . . . . : <redacted> Primary Dns Suffix . . . . . . . : <redacted> Node Type . . . . . . . . . . . . : Hybrid IP Routing Enabled. . . . . . . . : No WINS Proxy Enabled. . . . . . . . : No DNS Suffix Search List. . . . . . : <redacted> <redacted> Ethernet adapter Local Area Connection: Connection-specific DNS Suffix . : <redacted> 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 en 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)


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


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 de arp -a en comparación con la dirección IP que se ejecutó. la desventaja de hacerlo de esa manera es que necesita escribir la respuesta ping en la memoria de python y realizar una operación readline para recuperar la dirección IP y luego escribir los datos arp correspondientes en la memoria mientras escribe el nombre del sistema, dirección IP y ID de mac a la máquina en cuestión en la pantalla o en 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.


Como vartec sugirió que las netifaces deberían funcionar bien para pasar de 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''