real - socket python 3
Python: obtenga la dirección MAC de solo la NIC local conectada (6)
Esta pregunta ya tiene una respuesta aquí:
- Obteniendo MAC Address 12 respuestas
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)
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''
No puede recuperar la dirección MAC de una IP externa.
Consulte las discusiones sobre cómo obtener la dirección MAC de la IP externa en C # para obtener más aclaraciones.