Я использую
macaddr=$(echo $FQDN|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')
Преимущество этого метода, по абсолютно случайному числу, то, что возможно надежно воспроизвести MAC-адрес на основе FQDN машины, которую я нахожу полезными иногда. 02
поскольку первый октет просто устанавливает "локально присвоенный" бит, который делает его очевидным, что это не обеспеченный поставщиками MAC-адрес и гарантирует, что Вы не столкнетесь с MAC-адресом реального NIC.
Если необходимо генерировать несколько MAC-адресов на хост, я раньше связывал FQDN с названием моста для соединения интерфейса с; это убрало хорошее задание распространяющихся вещей для другого NICs.
Только для забавы, вот чистая версия удара, протестированная против Bash 4.4.12 (1) - выпуск:
read -N6 b </dev/urandom
LC_ALL=C printf "%02x:%02x:%02x:%02x:%02x:%02x\n" "'${b:0:1}" "'${b:1:1}" "'${b:2:1}" "'${b:3:1}" "'${b:4:1}" "'${b:5:1}"
Первая строка читает 6 символов от /dev/urandom
; затем использование набора символов C печатает 0 заполненное шестнадцатеричное значение каждого символа, разделенного с двоеточием (новая строка является дополнительной, но полезной для распечатывания значения).
Извлечение значения символа с помощью printf определяется в документации POSIX printf :
, Если начальный символ является одинарной кавычкой или двойной кавычкой, значение должно быть числовым значением в базовом кодовом наборе символа после одинарной кавычки или двойной кавычки.
Отправленные сценарии хороши, но я хочу добавить предупреждение: Следите за Днем рождения (paradoxon)!
Это прибывает из того, что, даже если у Вас есть всего 23 человека, шанс уже - 50%, что у 2 из них есть день рождения в тот же день.
Это зависит от Вашего сценария, как Вы используете его, но если Вы генерируете MACS случайным образом приблизительно в 1 миллионе Ваших шансов для числа Mac, столкновение составляет 40% в 2 миллионах, это уже - 87%!
При необходимости просто в паре, это в порядке, но когда Вы поддерживаете ферму сервера с сотнями серверов, каждым из них размещающий десятки виртуальных машин, или если Вы используете макинтоши в качестве индекса в некотором дб для бухгалтерии, и Вам нужен uniques, осторожны!
myserver% perl -e 'for ($i=0;$i<6;$i++){@m[$i]=int(rand(256));} printf "%X:%X:%X:%X:%X:%X\n",@m;'
55:C2:A5:FA:17:74
А-ч, старая швейцарская армейская Цепная пила едет снова. И посредством версии 0.2, я нагло краду точное замечание womble о первом октете, являющемся 02:
myserver% perl -e 'for ($i=0;$i<5;$i++){@m[$i]=int(rand(256));} printf "02:%X:%X:%X:%X:%X\n",@m;'
02:8E:94:A3:47:26
Here's another one, based on wombie's answer:
macaddr=$(dd if=/dev/urandom bs=1024 count=1 2>/dev/null|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5:\6/')
echo $macaddr
Я знаю, что этот пост старый, но для будущих посетителей, если вы хотите криптографически безопасный псевдослучайный MAC-адрес, не ограничиваясь 0x02 в качестве OUI, это быстрый, в основном независимый от платформы генератор:
$ printf '%02x' $((0x$(od /dev/urandom -N1 -t x1 -An | cut -c 2-) & 0xFE | 0x02)); od /dev/urandom -N5 -t x1 -An | sed 's/ /:/g'
Вы можете просто добавить $ RANDOM после $ FQDN, и это даст вам случайные MAC-адреса при каждом запуске. Это особенно полезно для пользователей, которые хотят создавать резервные копии виртуальных машин с использованием моментальных снимков или клонов виртуальных машин.
macaddr=$(echo $FQDN$RANDOM|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')
Эти варианты также работают.
длиннее:
openssl rand -hex 6 | sed 's/\(..\)\(..\)\(..\)\(..\)\(..\)\(..\)/\1:\2:\3:\4:\5:\6/'
или короче:
openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/:$//'
Потребление нагрузки обоих вариантов очень похоже согласно быстрому измерению во времени.
Вот пять других вариантов, все из которых используют случайные биты для младшего бита старшего байта, который указывает, является ли адрес одноадресным или многоадресным, и для второго младшего значащего бита старшего байта, который указывает, адрес администрируется локально или универсально.
jot -w%02X -s: -r 6 1 256
openssl rand -hex 6|fold -w2|paste -sd: -
od -N6 -tx1 -An /dev/random|awk '$1=$1'|tr \ :
god -N6 -tx1 -An /dev/random|cut -c2-|tr \ :
hexdump -n6 -e'/1 ":%02X"' /dev/random|cut -c2-
jot
поставляется с OS X и BSD, но не с большинством дистрибутивов Linux. В jot
-w
изменяет формат, -s
изменяет разделитель, а -r
генерирует случайные числа.
od
is в POSIX, но hexdump
нет.
OS X od
( / usr / bin / od
ниже) использует другой формат вывода, чем GNU od
:
$ /usr/bin/od -N6 -tx1 -An /dev/random|tr ' ' :
:::::::::::d9::b9::d7::da::5f::96::::::::::::::::::::::::::::::::::::::::
$ god -N6 -tx1 -An /dev/random|tr ' ' :
:f5:6d:0a:3b:39:f9
В OS X od
параметры, помещенные после аргумента для входного файла, обрабатываются как имена входных файлов, поэтому команда в ответе Аарона Топонсе читает из / dev / urandom
на неопределенный срок с OS X или
.