J'ai besoin d'une méthode multiplateforme pour déterminer l'adresse MAC d'un ordinateur au moment de l'exécution. Pour Windows, le module 'wmi' peut être utilisé et la seule méthode sous Linux que j'ai pu trouver était d'exécuter ifconfig et d'exécuter une expression régulière sur sa sortie. Je n'aime pas utiliser un package qui ne fonctionne que sur un seul système d'exploitation, et l'analyse de la sortie d'un autre programme ne semble pas très élégante, sans parler des erreurs.
Est-ce que quelqu'un connaît une méthode multiplateforme (Windows et Linux) pour obtenir l'adresse MAC? Sinon, est-ce que quelqu'un connaît des méthodes plus élégantes que celles que j'ai énumérées ci-dessus?
python
windows
linux
networking
Mark Roddy
la source
la source
Réponses:
Python 2.5 inclut une implémentation uuid qui (dans au moins une version) a besoin de l'adresse mac. Vous pouvez facilement importer la fonction de recherche Mac dans votre propre code:
La valeur de retour est l'adresse mac sous forme d'entier 48 bits.
la source
getnode
documentation, elle indique qu'elle renverra un long aléatoire s'il ne parvient pas à détecter le mac: "Si toutes les tentatives pour obtenir l'adresse matérielle échouent, nous choisissons un nombre aléatoire de 48 bits avec son huitième bit mis à 1 comme recommandé dans la RFC 4122. " Alors vérifiez ce huitième bit!hex(mac)
pour obtenir le format hexadécimal familier du mac':'.join(("%012X" % mac)[i:i+2] for i in range(0, 12, 2))
pour un MAC en majuscule avec chaque octet séparé par un deux-points.La solution pure python pour ce problème sous Linux pour obtenir le MAC pour une interface locale spécifique, initialement publiée en tant que commentaire par vishnubob et améliorée par sur Ben Mackey dans cette recette d'activation
Voici le code compatible Python 3:
la source
netifaces est un bon module à utiliser pour obtenir l'adresse mac (et d'autres adresses). C'est crossplatform et cela a un peu plus de sens que d'utiliser socket ou uuid.
emplacement pypi
Bonne introduction à netifaces
la source
Une autre chose que vous devez noter est que vous
uuid.getnode()
pouvez simuler l'adresse MAC en renvoyant un nombre aléatoire de 48 bits qui peut ne pas être ce que vous attendez. De plus, il n'y a aucune indication explicite que l'adresse MAC a été falsifiée, mais vous pouvez la détecter en appelantgetnode()
deux fois et en voyant si le résultat varie. Si la même valeur est renvoyée par les deux appels, vous avez l'adresse MAC, sinon vous obtenez une fausse adresse.la source
Parfois, nous avons plus d'une interface réseau.
Une méthode simple pour connaître l'adresse mac d'une interface spécifique est:
appeler la méthode est simple
la source
En utilisant ma réponse d'ici: https://stackoverflow.com/a/18031868/2362361
Il serait important de savoir pour quelle iface vous voulez le MAC car beaucoup peuvent exister (bluetooth, plusieurs nics, etc.).
Cela fait le travail lorsque vous connaissez l'adresse IP de l'iface pour laquelle vous avez besoin du MAC, en utilisant
netifaces
(disponible dans PyPI):Essai:
la source
Vous pouvez le faire avec psutil qui est multiplateforme:
la source
import socket
puis[addr.address for n in nics for addr in nics[n] if n == 'enp4s0' and addr.family == socket.AF_PACKET]
résultats['ab:cd:ef:01:02:03']
Notez que vous pouvez créer votre propre bibliothèque multiplateforme en python à l'aide d'importations conditionnelles. par exemple
Cela vous permettra d'utiliser des appels os.system ou des bibliothèques spécifiques à la plateforme.
la source
Le package getmac multiplateforme fonctionnera pour cela, si cela ne vous dérange pas de prendre une dépendance. Il fonctionne avec Python 2.7+ et 3.4+. Il essaiera de nombreuses méthodes différentes jusqu'à obtenir une adresse ou renvoyer Aucune.
Avertissement: Je suis l'auteur du package.
Mise à jour (14 janvier 2019): le package ne prend désormais en charge que Python 2.7+ et 3.4+. Vous pouvez toujours utiliser une ancienne version du package si vous devez travailler avec un ancien Python (2.5, 2.6, 3.2, 3.3).
la source
Pour obtenir l'
eth0
adresse MAC de l' interface,la source
Je ne connais pas de manière unifiée, mais voici quelque chose que vous pourriez trouver utile:
http://www.codeguru.com/Cpp/IN/network/networkinformation/article.php/c5451
Ce que je ferais dans ce cas serait de les envelopper dans une fonction, et en fonction du système d'exploitation, il exécuterait la commande appropriée, analyserait si nécessaire et ne renverrait que l'adresse MAC formatée comme vous le souhaitez. C'est bien sûr tout de même, sauf que vous ne devez le faire qu'une seule fois, et cela semble plus propre du code principal.
la source
Pour Linux, permettez-moi d'introduire un script shell qui affichera l'adresse mac et permet de la changer (reniflage MAC).
Les arguments de coupe peuvent différer (je ne suis pas un expert) essayer:
Pour changer de MAC, nous pouvons faire:
changera l'adresse mac à 00: 80: 48: BA: d1: 30 (temporairement, restaure à l'adresse réelle au redémarrage).
la source
Alternativement,
la source
Pour Linux, vous pouvez récupérer l'adresse MAC à l'aide d'un ioctl SIOCGIFHWADDR.
Vous avez tagué la question "python". Je ne connais pas de module Python existant pour obtenir ces informations. Vous pouvez utiliser ctypes pour appeler l'ioctl directement.
la source