как генерировать случайный MAC-адрес из командной строки Linux

Ну, я думаю find / -iname '*foo*' была бы лучшая команда. Но можно перенаправить stderr к/dev/null для избавлений от всех ошибок. Или перенаправьте stderr к stdout и затем отфильтруйте с grep:

find / 2>/dev/null | grep foo
find \  |& grep 'No Such'
26
задан 11 October 2012 в 19:12
11 ответов

Я использую

macaddr=$(echo $FQDN|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')

Преимущество этого метода, по абсолютно случайному числу, то, что возможно надежно воспроизвести MAC-адрес на основе FQDN машины, которую я нахожу полезными иногда. 02 поскольку первый октет просто устанавливает "локально присвоенный" бит, который делает его очевидным, что это не обеспеченный поставщиками MAC-адрес и гарантирует, что Вы не столкнетесь с MAC-адресом реального NIC.

Если необходимо генерировать несколько MAC-адресов на хост, я раньше связывал FQDN с названием моста для соединения интерфейса с; это убрало хорошее задание распространяющихся вещей для другого NICs.

46
ответ дан 28 November 2019 в 20:07

Острота Python:

python3 -c 'import os; print(":".join(["{:02x}".format(x) for x in b"\02x" + os.urandom(5)]))'
0
ответ дан 28 November 2019 в 20:07

Только для забавы, вот чистая версия удара, протестированная против 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 :

, Если начальный символ является одинарной кавычкой или двойной кавычкой, значение должно быть числовым значением в базовом кодовом наборе символа после одинарной кавычки или двойной кавычки.

0
ответ дан 28 November 2019 в 20:07

Отправленные сценарии хороши, но я хочу добавить предупреждение: Следите за Днем рождения (paradoxon)!

Это прибывает из того, что, даже если у Вас есть всего 23 человека, шанс уже - 50%, что у 2 из них есть день рождения в тот же день.

Это зависит от Вашего сценария, как Вы используете его, но если Вы генерируете MACS случайным образом приблизительно в 1 миллионе Ваших шансов для числа Mac, столкновение составляет 40% в 2 миллионах, это уже - 87%!

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

8
ответ дан 28 November 2019 в 20:07
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
5
ответ дан 28 November 2019 в 20:07

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
2
ответ дан 28 November 2019 в 20:07

Я знаю, что этот пост старый, но для будущих посетителей, если вы хотите криптографически безопасный псевдослучайный 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'
4
ответ дан 28 November 2019 в 20:07

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

macaddr=$(echo $FQDN$RANDOM|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')
1
ответ дан 28 November 2019 в 20:07

Я использую:

echo -n 02; od -t x1 -An -N 5 /dev/urandom | tr ' ' ':'
0
ответ дан 28 November 2019 в 20:07

Эти варианты также работают.

длиннее:

openssl rand -hex 6 | sed 's/\(..\)\(..\)\(..\)\(..\)\(..\)\(..\)/\1:\2:\3:\4:\5:\6/'

или короче:

openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/:$//'

Потребление нагрузки обоих вариантов очень похоже согласно быстрому измерению во времени.

5
ответ дан 28 November 2019 в 20:07

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

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 или .

2
ответ дан 28 November 2019 в 20:07

Теги

Похожие вопросы