Генератор MAC-адресов в Python - PullRequest
3 голосов
/ 13 декабря 2011

Для создания массовых виртуальных машин мне нужно создать генератор случайных MAC-адресов в Python.Я не знаю, как генерировать случайные MAC-адреса.

Правильна ли следующая программа или нет?

import random

# The first line is defined for specified vendor
mac = [ 0x00, 0x24, 0x81,
    random.randint(0x00, 0x7f),
    random.randint(0x00, 0xff),
    random.randint(0x00, 0xff) ]

print ':'.join(map(lambda x: "%02x" % x, mac))

Ответы [ 4 ]

2 голосов
/ 21 апреля 2017

Для тех, кто хочет создать свои собственные MAC-адреса (хороший пример для сетевых адаптеров виртуальных машин), вы, вероятно, просто хотите это:

"02:00:00:%02x:%02x:%02x" % (random.randint(0, 255),
                             random.randint(0, 255),
                             random.randint(0, 255))

Или, если вы хотите сделать это в оболочке unix'y, это работает на многих:

printf '02:00:00:%02X:%02X:%02X\n' $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256))

Это дает вам одноадресный MAC-адрес, который на 100% безопасен для использования в вашей среде и не нарушает чье-либо зарегистрированное пространство MAC-адресов.


Подробнее ...

Два нижних бита старшего байта (0x02) дают вам локально управляемый адрес одноадресной рассылки, который, вероятно, вам нужен, если вы запускаете stackoverflow для его генерации. :)

Если MAC-адрес не локально администрируется, это означает, что он должен быть «глобально уникальным». MAC-адреса в этой категории централизованно зарегистрированы в IEEE, и у вас должен быть уникальный OUI (Организационно-уникальный идентификатор), выданный вам IEEE. См. эту ссылку для глобального реестра значений OUI. Это значение OUI заканчивается в первых 3 байтах (или только в первых 22 битах).

MAC-адреса не так сложны, так что вам, вероятно, также стоит взглянуть на определение. В Википедии есть хороший .

1 голос
/ 20 мая 2016

Изменено с кода мамофиша на Python3:

mac = '00:00:00:'
for number in range(16**6):
    hex_num = hex(number)[2:].zfill(6)
    print("{}{}{}:{}{}:{}{}".format(mac,*hex_num))

Создает mac-адреса в виде строк от 00:00:00:00:00:00 до 00:00:00:ff:ff:ff.

1 голос
/ 13 декабря 2011

Поскольку уникальность - это все, о чем вы должны заботиться (помимо правильного формирования адреса), я бы беспокоился о MSB в OUI и использовал бы последовательность в байтах, специфичных для NIC.Распределение адресов, скорее всего, неважно для вашего приложения (даже если некоторые реализации NIC или коммутаторов могут использовать их в качестве входных данных для хэша, это, вероятно, не будет большой проблемой).

Вы может захотеть использовать флаг локального администрирования в OUI , чтобы избежать конфликта с существующим производителем устройства.

Избегайте ловушек, таких как установка бита многоадресной рассылки (ваш пример).

0 голосов
/ 13 декабря 2011

Чтобы избежать дубликатов:

Если вы собираетесь сгенерировать LOT (миллионы) таких MAC-адресов, вы можете сгенерировать упорядоченный список MAC-адресов, передать его в процесс линейной рандомизации (GNU sort -R должно работать нормально - I не думайте, что он делает это за линейное время, но у него один и тот же конечный результат) один раз, а затем извлекайте свежие адреса из одного конца рандомизированного списка по мере необходимости. Я считаю, что такой список должен занимать около 34 мегабайт.

Если вам просто нужны тысячи, вам, вероятно, лучше сохранить текстовый файл с уже выбранными значениями и проверять наличие коллизий, добавляя новые значения по мере продвижения. Это асимптотически более медленный алгоритм, но он требует гораздо меньше накладных расходов, поэтому он все равно должен быть выигрышным для меньшего числа mac-адресов.

Кстати, должен ли 4-й октет (пронумерованный от 1, начинающийся слева) быть 0-ff вместо 0-7f? Я не вижу случаев 7f или 127 на странице Википедии на адресах Mac: http://en.wikipedia.org/wiki/MAC_address

...