Necesito un método multiplataforma para determinar la dirección MAC de una computadora en tiempo de ejecución. Para Windows, se puede usar el módulo 'wmi' y el único método en Linux que pude encontrar fue ejecutar ifconfig y ejecutar una expresión regular en su salida. No me gusta usar un paquete que solo funciona en un sistema operativo, y analizar la salida de otro programa no parece muy elegante, por no mencionar propenso a errores.
¿Alguien conoce un método multiplataforma (windows y linux) para obtener la dirección MAC? Si no es así, ¿alguien conoce algún método más elegante que los que enumeré anteriormente?
python
windows
linux
networking
Mark Roddy
fuente
fuente
Respuestas:
Python 2.5 incluye una implementación uuid que (en al menos una versión) necesita la dirección mac. Puede importar la función de búsqueda de mac en su propio código fácilmente:
El valor de retorno es la dirección mac como un entero de 48 bits.
fuente
getnode
documentación, dice que devolverá un largo aleatorio si no detecta el mac: "Si todos los intentos de obtener la dirección de hardware fallan, elegimos un número aleatorio de 48 bits con su octavo bit establecido en 1 como se recomienda en RFC 4122. " ¡Así que revisa ese octavo bit!hex(mac)
para obtener el formato hexadecimal familiar del mac':'.join(("%012X" % mac)[i:i+2] for i in range(0, 12, 2))
para un MAC en mayúsculas con cada byte separado por dos puntos.La solución de Python pura para este problema en Linux para obtener el MAC para una interfaz local específica, originalmente publicado como un comentario por vishnubob y mejorado por Ben Mackey en esta receta de estado activo
Este es el código compatible con Python 3:
fuente
netifaces es un buen módulo para obtener la dirección mac (y otras direcciones). Es multiplataforma y tiene un poco más de sentido que usar socket o uuid.
ubicación de pypi
Buena introducción a netifaces
fuente
Otra cosa que debe tener en cuenta es que
uuid.getnode()
puede falsificar la dirección MAC devolviendo un número aleatorio de 48 bits que puede no ser lo que esperaba. Además, no hay ninguna indicación explícita de que la dirección MAC haya sido falsificada, pero podría detectarla llamandogetnode()
dos veces y viendo si el resultado varía. Si ambas llamadas devuelven el mismo valor, tienes la dirección MAC; de lo contrario, obtendrás una dirección falsa.fuente
A veces tenemos más de una interfaz de red.
Un método simple para averiguar la dirección mac de una interfaz específica es:
llamar al método es simple
fuente
Usando mi respuesta desde aquí: https://stackoverflow.com/a/18031868/2362361
Sería importante saber para qué iface quieres el MAC ya que pueden existir muchos (bluetooth, varios nics, etc.).
Esto funciona cuando conoce la IP del iface para el que necesita el MAC, usando
netifaces
(disponible en PyPI):Pruebas:
fuente
Puede hacer esto con psutil, que es multiplataforma:
fuente
import socket
luego[addr.address for n in nics for addr in nics[n] if n == 'enp4s0' and addr.family == socket.AF_PACKET]
resulta en['ab:cd:ef:01:02:03']
Tenga en cuenta que puede crear su propia biblioteca multiplataforma en Python utilizando importaciones condicionales. p.ej
Esto le permitirá utilizar llamadas a os.system o bibliotecas específicas de la plataforma.
fuente
El paquete getmac multiplataforma funcionará para esto, si no le importa asumir una dependencia. Funciona con Python 2.7+ y 3.4+. Intentará muchos métodos diferentes hasta obtener una dirección o devolver Ninguno.
Descargo de responsabilidad: soy el autor del paquete.
Actualización (14 de enero de 2019): el paquete ahora solo es compatible con Python 2.7+ y 3.4+. Aún puede usar una versión anterior del paquete si necesita trabajar con un Python anterior (2.5, 2.6, 3.2, 3.3).
fuente
Para obtener la
eth0
dirección MAC de la interfaz,fuente
No conozco una forma unificada, pero aquí hay algo que puede resultarle útil:
http://www.codeguru.com/Cpp/IN/network/networkinformation/article.php/c5451
Lo que haría en este caso sería agruparlos en una función y, según el sistema operativo, ejecutaría el comando adecuado, analizaría según sea necesario y devolvería solo la dirección MAC formateada como desee. Por supuesto, es de todos modos, excepto que solo tienes que hacerlo una vez, y se ve más limpio desde el código principal.
fuente
Para Linux, permítanme presentarles un script de shell que mostrará la dirección mac y permitirá cambiarla (rastreo de MAC).
Los argumentos de corte pueden dffer (no soy un experto) intente:
Para cambiar MAC podemos hacer:
cambiará la dirección mac a 00: 80: 48: BA: d1: 30 (temporalmente, se restaurará a la actual al reiniciar).
fuente
Alternativamente,
fuente
Para Linux, puede recuperar la dirección MAC utilizando un ioctl SIOCGIFHWADDR.
Has etiquetado la pregunta "python". No conozco un módulo de Python existente para obtener esta información. Puede usar ctypes para llamar al ioctl directamente.
fuente