Ich benötige eine plattformübergreifende Methode zum Ermitteln der MAC-Adresse eines Computers zur Laufzeit. Für Windows kann das 'wmi'-Modul verwendet werden, und die einzige Methode unter Linux, die ich finden konnte, bestand darin, ifconfig auszuführen und einen regulären Ausdruck für die Ausgabe auszuführen. Ich mag es nicht, ein Paket zu verwenden, das nur auf einem Betriebssystem funktioniert, und das Parsen der Ausgabe eines anderen Programms scheint nicht sehr elegant zu sein, ganz zu schweigen von der Fehleranfälligkeit.
Kennt jemand eine plattformübergreifende Methode (Windows und Linux), um die MAC-Adresse zu erhalten? Wenn nicht, kennt jemand elegantere Methoden als die oben aufgeführten?
python
windows
linux
networking
Mark Roddy
quelle
quelle
Antworten:
Python 2.5 enthält eine UUID-Implementierung, die (in mindestens einer Version) die Mac-Adresse benötigt. Sie können die Mac-Suchfunktion einfach in Ihren eigenen Code importieren:
Der Rückgabewert ist die Mac-Adresse als 48-Bit-Ganzzahl.
quelle
getnode
Dokumentation ansehen , heißt es, dass ein zufälliger Long zurückgegeben wird, wenn der Mac nicht erkannt wird: "Wenn alle Versuche, die Hardwareadresse zu erhalten, fehlschlagen, wählen wir eine zufällige 48-Bit-Zahl mit ihrem achten Bit wie in RFC 4122 empfohlen auf 1 gesetzt. " Überprüfen Sie also das achte Bit!hex(mac)
um das bekannte Hex-Format des Mac zu erhalten':'.join(("%012X" % mac)[i:i+2] for i in range(0, 12, 2))
für einen MAC in Großbuchstaben, wobei jedes Byte durch einen Doppelpunkt getrennt ist.Die reine Python-Lösung für dieses Problem unter Linux, um den MAC für eine bestimmte lokale Schnittstelle zu erhalten, die ursprünglich als Kommentar von vishnubob veröffentlicht und von Ben Mackey in diesem Aktivierungsrezept verbessert wurde
Dies ist der Python 3-kompatible Code:
quelle
netifaces ist ein gutes Modul zum Abrufen der Mac-Adresse (und anderer Adressen). Es ist plattformübergreifend und etwas sinnvoller als die Verwendung von Socket oder UUID.
Pypi Lage
Gute Einführung in Netifaces
quelle
Eine andere Sache, die Sie beachten sollten, ist, dass
uuid.getnode()
die MAC-Adresse gefälscht werden kann, indem eine zufällige 48-Bit-Zahl zurückgegeben wird, die möglicherweise nicht Ihren Erwartungen entspricht. Es gibt auch keinen expliziten Hinweis darauf, dass die MAC-Adresse gefälscht wurde. Sie können sie jedoch erkennen, indem Siegetnode()
zweimal anrufen und prüfen, ob das Ergebnis variiert. Wenn bei beiden Aufrufen der gleiche Wert zurückgegeben wird, haben Sie die MAC-Adresse, andernfalls erhalten Sie eine gefälschte Adresse.quelle
Manchmal haben wir mehr als eine Netzschnittstelle.
Eine einfache Methode, um die Mac-Adresse einer bestimmten Schnittstelle herauszufinden, ist:
Die Methode aufzurufen ist einfach
quelle
Verwenden Sie meine Antwort von hier: https://stackoverflow.com/a/18031868/2362361
Es wäre wichtig zu wissen, für welches iface Sie den MAC möchten, da viele existieren können (Bluetooth, mehrere Nics usw.).
Dies erledigt die Aufgabe, wenn Sie die IP des iface kennen, für das Sie den MAC benötigen, und zwar mithilfe
netifaces
(verfügbar in PyPI):Testen:
quelle
Sie können dies mit plattformübergreifendem psutil tun:
quelle
import socket
dann[addr.address for n in nics for addr in nics[n] if n == 'enp4s0' and addr.family == socket.AF_PACKET]
ergibt sich['ab:cd:ef:01:02:03']
Beachten Sie, dass Sie mithilfe von bedingten Importen Ihre eigene plattformübergreifende Bibliothek in Python erstellen können. z.B
Auf diese Weise können Sie os.system-Aufrufe oder plattformspezifische Bibliotheken verwenden.
quelle
Das plattformübergreifende getmac- Paket funktioniert hierfür, wenn es Ihnen nichts ausmacht, eine Abhängigkeit zu übernehmen. Es funktioniert mit Python 2.7+ und 3.4+. Es werden viele verschiedene Methoden ausprobiert, bis entweder eine Adresse abgerufen oder None zurückgegeben wird.
Haftungsausschluss: Ich bin der Autor des Pakets.
Update (14. Januar 2019): Das Paket unterstützt jetzt nur Python 2.7+ und 3.4+. Sie können weiterhin eine ältere Version des Pakets verwenden, wenn Sie mit einem älteren Python (2.5, 2.6, 3.2, 3.3) arbeiten müssen.
quelle
Um die
eth0
MAC-Adresse der Schnittstelle zu erhalten ,quelle
Ich kenne keinen einheitlichen Weg, aber hier ist etwas, das Sie vielleicht nützlich finden:
http://www.codeguru.com/Cpp/IN/network/networkinformation/article.php/c5451
In diesem Fall würde ich diese in eine Funktion einbinden und basierend auf dem Betriebssystem den richtigen Befehl ausführen, nach Bedarf analysieren und nur die nach Ihren Wünschen formatierte MAC-Adresse zurückgeben. Es ist natürlich egal, außer dass Sie es nur einmal tun müssen, und es sieht sauberer aus als der Hauptcode.
quelle
Für Linux möchte ich ein Shell-Skript einführen, das die Mac-Adresse anzeigt und deren Änderung ermöglicht (MAC-Sniffing).
Schnittargumente können dffer (ich bin kein Experte) versuchen:
Um den MAC zu ändern, können wir:
ändert die Mac-Adresse in 00: 80: 48: BA: d1: 30 (wird vorübergehend beim Neustart auf die tatsächliche wiederhergestellt).
quelle
Alternative,
quelle
Unter Linux können Sie die MAC-Adresse mit einem SIOCGIFHWADDR ioctl abrufen.
Sie haben die Frage "Python" markiert. Ich kenne kein vorhandenes Python-Modul, um diese Informationen zu erhalten. Sie können ctypes verwenden , um das ioctl direkt aufzurufen.
quelle