Potrzebuję wieloplatformowej metody określania adresu MAC komputera w czasie wykonywania. W systemie Windows można użyć modułu „wmi”, a jedyną metodą, jaką znalazłem pod Linuksem, było uruchomienie ifconfig i wykonanie wyrażenia regularnego na jego wyjściu. Nie podoba mi się używanie pakietu, który działa tylko w jednym systemie operacyjnym, a analiza danych wyjściowych innego programu nie wydaje się zbyt elegancka, nie wspominając o podatności na błędy.
Czy ktoś zna metodę międzyplatformową (Windows i Linux), aby uzyskać adres MAC? Jeśli nie, to czy ktoś zna bardziej eleganckie metody niż te, które wymieniłem powyżej?
python
windows
linux
networking
Mark Roddy
źródło
źródło
Odpowiedzi:
Python 2.5 zawiera implementację uuid, która (w co najmniej jednej wersji) wymaga adresu mac. Możesz łatwo zaimportować funkcję wyszukiwania mac do własnego kodu:
Wartość zwracana to adres mac jako 48-bitowa liczba całkowita.
źródło
getnode
dokumentację, zobaczysz, że zwróci losowo długi czas, jeśli nie wykryje mac: „Jeśli wszystkie próby uzyskania adresu sprzętowego zawiodą, wybieramy losową 48-bitową liczbę z jej ósmym bitem ustaw na 1 zgodnie z zaleceniami w dokumencie RFC 4122. ” Więc sprawdź ósmy kawałek!hex(mac)
aby uzyskać znajomy format szesnastkowy komputera Mac':'.join(("%012X" % mac)[i:i+2] for i in range(0, 12, 2))
w przypadku adresu MAC z wielkimi literami, w którym każdy bajt jest oddzielony dwukropkiem.Czyste rozwiązanie w Pythonie dla tego problemu pod Linuksem, aby uzyskać MAC dla określonego lokalnego interfejsu, pierwotnie opublikowane jako komentarz przez vishnubob i ulepszone przez Bena Mackeya w tym przepisie dotyczącym aktywnej wersji
Oto kod zgodny z Python 3:
źródło
netifaces to dobry moduł do pobrania adresu MAC (i innych adresów). Jest wieloplatformowy i ma nieco więcej sensu niż użycie gniazda lub uuid.
lokalizacja pypi
Dobre wprowadzenie do netifaces
źródło
Inną rzeczą, na którą powinieneś zwrócić uwagę, jest to, że
uuid.getnode()
może sfałszować adres MAC, zwracając losową 48-bitową liczbę, która może nie być tym, czego oczekujesz. Ponadto nie ma wyraźnego wskazania, że adres MAC został sfałszowany, ale można go wykryć, dzwoniącgetnode()
dwukrotnie i sprawdzając, czy wynik się różni. Jeśli oba wywołania zwracają tę samą wartość, masz adres MAC, w przeciwnym razie otrzymujesz fałszywy adres.źródło
Czasami mamy więcej niż jeden interfejs sieciowy.
Prostą metodą znalezienia adresu MAC konkretnego interfejsu jest:
wywołanie metody jest proste
źródło
Korzystając z mojej odpowiedzi tutaj: https://stackoverflow.com/a/18031868/2362361
Byłoby ważne, aby wiedzieć, do którego adresu MAC chcesz mieć adres MAC, ponieważ może istnieć wiele (bluetooth, kilka kart sieciowych itp.).
Wykonuje to zadanie, gdy znasz adres IP, do którego potrzebujesz adresu MAC, używając
netifaces
(dostępne w PyPI):Testowanie:
źródło
Możesz to zrobić za pomocą psutil, który jest wieloplatformowy:
źródło
import socket
następnie[addr.address for n in nics for addr in nics[n] if n == 'enp4s0' and addr.family == socket.AF_PACKET]
skutkuje['ab:cd:ef:01:02:03']
Zauważ, że możesz zbudować własną bibliotekę wieloplatformową w Pythonie, używając importu warunkowego. na przykład
Umożliwi to korzystanie z wywołań os.system lub bibliotek specyficznych dla platformy.
źródło
Cross-platform getmac pakiet będzie działać na tym, jeśli nie masz nic przeciwko biorąc na uzależnienia. Działa z Pythonem 2.7+ i 3.4+. Spróbuje wielu różnych metod, dopóki nie uzyska adresu lub nie zwróci None.
Zastrzeżenie: jestem autorem pakietu.
Aktualizacja (14 stycznia 2019 r.): Pakiet obsługuje teraz tylko Python 2.7+ i 3.4+. Nadal możesz używać starszej wersji pakietu, jeśli potrzebujesz pracować ze starszym Pythonem (2.5, 2.6, 3.2, 3.3).
źródło
Aby uzyskać
eth0
adres MAC interfejsu,źródło
Nie znam jednolitego sposobu, ale oto coś, co może Ci się przydać:
http://www.codeguru.com/Cpp/IN/network/networkinformation/article.php/c5451
To, co zrobiłbym w tym przypadku, byłoby zawinięciem ich w funkcję i na podstawie systemu operacyjnego uruchomiłoby odpowiednie polecenie, przeanalizowałoby zgodnie z wymaganiami i zwróciło tylko adres MAC sformatowany tak, jak chcesz. Oczywiście jest tak samo, z wyjątkiem tego, że musisz to zrobić tylko raz i wygląda bardziej czysto od głównego kodu.
źródło
W przypadku Linuksa przedstawię skrypt powłoki, który pokaże adres mac i umożliwi jego zmianę (sniffing MAC).
Wytnij argumenty mogą odrzucić (nie jestem ekspertem) spróbować:
Aby zmienić MAC możemy zrobić:
zmieni adres mac na 00: 80: 48: BA: d1: 30 (tymczasowo przywróci aktualny adres po ponownym uruchomieniu).
źródło
Alternatywnie,
źródło
W systemie Linux adres MAC można pobrać za pomocą ioctl SIOCGIFHWADDR.
Oznaczyłeś pytanie „python”. Nie znam istniejącego modułu Pythona, aby uzyskać te informacje. Możesz użyć ctypes do bezpośredniego wywołania ioctl.
źródło