Как мне сгенерировать случайный MAC-адрес из командной строки Linux?
Я ищу решение, которое требует только стандартных инструментов, обычно встречающихся в командной строке Linux.
MAC-адрес будет использоваться для гостевого KVM.
Как мне сгенерировать случайный MAC-адрес из командной строки Linux?
Я ищу решение, которое требует только стандартных инструментов, обычно встречающихся в командной строке Linux.
MAC-адрес будет использоваться для гостевого KVM.
Ответы:
я использую
macaddr=$(echo $FQDN|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')
Преимущество этого метода по сравнению с совершенно случайным числом заключается в том, что можно надежно воспроизводить MAC-адрес на основе полного доменного имени компьютера, что иногда мне кажется полезным. Для 02
первого октета просто устанавливается «локально назначенный» бит, который делает очевидным, что это не предоставленный поставщиком MAC-адрес, и гарантирует, что вы не столкнетесь с реальным MAC-адресом сетевой платы.
Если вам нужно сгенерировать несколько MAC-адресов для каждого хоста, я использовал для объединения полного доменного имени с именем моста, к которому подключен интерфейс; это помогло распространить информацию по различным сетевым картам.
tr -dc A-F0-9 < /dev/urandom | head -c 10 | sed -r 's/(..)/\1:/g;s/:$//;s/^/02:/'
Опубликованные сценарии хороши, но я хочу добавить предупреждение: Mind the Birthday (парадоксон)!
Это связано с тем, что даже если у вас всего 23 человека, вероятность того, что у 2 из них будет день рождения в один и тот же день, уже составляет 50%.
От того, как вы его используете, зависит от вашего сценария, но если вы генерируете MACS случайным образом, примерно при 1 миллионе ваш шанс столкновения чисел Mac составляет 40% при 2 миллионах, то это уже 87%!
Если вам нужна только пара, это нормально, но когда вы поддерживаете ферму серверов с сотнями серверов, на каждом из них размещены десятки виртуальных машин, или если вы используете macs в качестве индекса в некоторой базе данных для ведения бухгалтерии, и вам нужны unique, будьте осторожны !
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, я без стеснения краду отличную мысль Уомбла о том, что первый октет - 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
Эти варианты тоже работают.
больше:
openssl rand -hex 6 | sed 's/\(..\)\(..\)\(..\)\(..\)\(..\)\(..\)/\1:\2:\3:\4:\5:\6/'
или короче:
openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/:$//'
Потребление нагрузки в обоих вариантах очень похоже на быстрое измерение во времени.
fold -w2|paste -sd: -
вместо sed
. sed
Решение, вероятно , легче запомнить , как он использует более привычный инструмент - хотя я узнал больше от его / ее ответа.
ec
11101100 в двоичном виде ...
Я знаю, что этот пост старый, но для будущих посетителей, если вы хотите криптографически безопасный псевдослучайный 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'
Вот еще один, основанный на ответе Wombie:
macaddr=$(dd if=/dev/urandom bs=1024 count=1 2>/dev/null|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5:\6/')
echo $macaddr
Вот пять других вариантов, каждый из которых использует случайные биты для младшего значащего бита старшего значащего байта, который указывает, является ли адрес одноадресным или многоадресным, и для второго младшего значащего бита старшего значащего байта, который указывает, является ли адрес универсально или локально управляемый.
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
находится в 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
вариантах помещены после того, как аргумент для входного файла рассматриваются как имена входных файлов, так что команда в ответе Аарона Toponce читает на /dev/urandom
неопределенное время с OS иксов od
.
Вы можете просто добавить $ RANDOM после $ FQDN, и это даст вам случайные mac-адреса при каждом запуске. Это особенно полезно для людей, которые хотят создать резервную копию vms, используя снимки или клоны vms.
macaddr=$(echo $FQDN$RANDOM|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')
Я использую:
echo -n 02; od -t x1 -An -N 5 /dev/urandom | tr ' ' ':'
Просто для удовольствия, вот чистая версия bash, протестированная на 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 :
Если начальный символ представляет собой одинарную или двойную кавычку, значение должно быть числовым значением в базовом наборе символов, следующего за одинарной или двойной кавычкой.