Мне нужен кросс-платформенный метод определения MAC-адреса компьютера во время выполнения. Для Windows можно использовать модуль wmi, и единственный метод в Linux, который я смог найти, - это запустить ifconfig и запустить регулярное выражение на его выходе. Мне не нравится использовать пакет, который работает только в одной ОС, и анализ вывода другой программы не кажется очень элегантным, не говоря уже о подверженности ошибкам.
Кто-нибудь знает метод кросс-платформенного (windows и linux) для получения MAC-адреса? Если нет, знает ли кто-нибудь более элегантные методы, чем те, которые я перечислил выше?
python
windows
linux
networking
Марк Родди
источник
источник
Ответы:
Python 2.5 включает реализацию uuid, которой (по крайней мере, в одной версии) нужен MAC-адрес. Вы можете легко импортировать функцию поиска Mac в свой собственный код:
Возвращаемое значение - это 48-битное целое число MAC-адреса.
источник
getnode
документацию, там написано, что он вернет случайное длинное число, если не сможет обнаружить Mac: «Если все попытки получить аппаратный адрес терпят неудачу, мы выбираем случайное 48-битное число с его восьмым битом. установлено в 1, как рекомендовано в RFC 4122. " Так что проверьте восьмой бит!hex(mac)
чтобы получить знакомый шестнадцатеричный формат Mac':'.join(("%012X" % mac)[i:i+2] for i in range(0, 12, 2))
для MAC-адреса верхнего регистра с каждым байтом, разделенным двоеточием.Решение этой проблемы на чистом питоне под Linux для получения MAC для определенного локального интерфейса, первоначально опубликованное как комментарий vishnubob и улучшенное Беном Макки в этом рецепте activestate
Это код, совместимый с Python 3:
источник
netifaces - хороший модуль для получения MAC-адреса (и других адресов). Он кроссплатформенный и имеет немного больше смысла, чем использование socket или uuid.
расположение pypi
Хорошее введение в netifaces
источник
Еще одна вещь, на которую вы должны обратить внимание, - это то,
uuid.getnode()
что MAC-адрес можно подделать, вернув случайное 48-битное число, которое может не соответствовать вашим ожиданиям. Кроме того, нет явного указания на подделку MAC-адреса, но вы можете обнаружить его,getnode()
дважды позвонив и проверив, изменится ли результат. Если оба вызова возвращают одно и то же значение, у вас есть MAC-адрес, в противном случае вы получаете поддельный адрес.источник
Иногда у нас более одного сетевого интерфейса.
Простой способ узнать MAC-адрес определенного интерфейса:
вызвать метод просто
источник
Используя мой ответ отсюда: https://stackoverflow.com/a/18031868/2362361
Было бы важно знать, для какого места вы хотите использовать MAC, поскольку многие из них могут существовать (bluetooth, несколько сетевых адаптеров и т. Д.).
Это работает, когда вы знаете IP-адрес iface, для которого вам нужен MAC, используя
netifaces
(доступно в PyPI):Тестирование:
источник
Вы можете сделать это с помощью кроссплатформенного psutil:
источник
import socket
затем[addr.address for n in nics for addr in nics[n] if n == 'enp4s0' and addr.family == socket.AF_PACKET]
результаты['ab:cd:ef:01:02:03']
Обратите внимание, что вы можете создать свою собственную кросс-платформенную библиотеку на Python, используя условный импорт. например
Это позволит вам использовать системные вызовы os.system или библиотеки для конкретной платформы.
источник
Для этого подойдет кроссплатформенный пакет getmac , если вы не возражаете против зависимости. Он работает с Python 2.7+ и 3.4+. Он будет пробовать много разных методов, пока не получит адрес или не вернет None.
Отказ от ответственности: я являюсь автором пакета.
Обновление (14 января 2019 г.): пакет теперь поддерживает только Python 2.7+ и 3.4+. Вы все еще можете использовать старую версию пакета, если вам нужно работать со старым Python (2.5, 2.6, 3.2, 3.3).
источник
Чтобы получить
eth0
MAC-адрес интерфейса,источник
Я не знаю единого способа, но вот кое-что, что может вам пригодиться:
http://www.codeguru.com/Cpp/IN/network/networkinformation/article.php/c5451
Что я бы сделал в этом случае, так это обернуло бы их в функцию, и в зависимости от ОС она запустила бы правильную команду, проанализировала по мере необходимости и вернула только MAC-адрес, отформатированный так, как вы хотите. Конечно, все то же самое, за исключением того, что вам нужно сделать это только один раз, и это выглядит чище по сравнению с основным кодом.
источник
Для Linux позвольте мне представить сценарий оболочки, который покажет MAC-адрес и позволит его изменить (анализ MAC).
Вырезать аргументы можно (я не эксперт) попробуйте:
Чтобы изменить MAC, мы можем:
изменит MAC-адрес на 00: 80: 48: BA: d1: 30 (временно, вернется к фактическому при перезагрузке).
источник
С другой стороны,
источник
Для Linux вы можете получить MAC-адрес с помощью SIOCGIFHWADDR ioctl.
Вы отметили вопрос "питон". Я не знаю существующего модуля Python для получения этой информации. Вы можете использовать ctypes для прямого вызова ioctl.
источник