як генерувати випадкову MAC-адресу з командного рядка Linux


26

Як створити випадкову MAC-адресу з командного рядка Linux?

Я шукаю рішення, яке вимагає лише стандартних інструментів, які зазвичай зустрічаються в командному рядку Linux.

MAC-адреса використовуватиметься для запрошеного KVM.

Відповіді:


46

я використовую

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

Перевага цього методу над цілком випадковим числом полягає в тому, що можна надійно відтворити MAC-адресу на основі FQDN машини, що іноді я вважаю корисним. 02Для першого октету просто встановлює «локально призначений» біт, що робить очевидним , що це не від постачальника при умови , MAC - адреса, і гарантує , що ви не будете мати справу з MAC - адресою справжньою Виконавця.

Якщо вам потрібно генерувати декілька MAC-адрес на один хост, я використовував для з'єднання FQDN з ім'ям мосту для підключення інтерфейсу; це зробило гарну роботу по поширенню речей для різних НІК.


+1 для відтворюваності; для певних застосувань це дозволяє значно покращити метод розробки.
MadHatter підтримує Моніку

Велике спасибі, мені подобається ідея відтворення.
Ерік Шьолунд

Плюс жодних конфліктів на адресу mac у випадку малоймовірної події, ви б випадково генерували той самий мак двічі
Petter H,

3
Як альтернативу ви можете скористатисяtr -dc A-F0-9 < /dev/urandom | head -c 10 | sed -r 's/(..)/\1:/g;s/:$//;s/^/02:/'
ALex_hha

1
Це лише "альтернатива" в тому сенсі, що вона дає зовсім інший кінцевий результат до того, що робить мій фрагмент ...
Утром

8

Опубліковані сценарії хороші, але я хочу додати попередження: Пам'ятай про день народження (парадоксон)!

Це випливає з того, що навіть якщо у вас всього 23 людини, шанс вже на 50%, що 2 з них мають день народження в той же день.

Це залежить від вашого сценарію, як ви його використовуєте, але якщо ви генеруєте MACS випадковим чином, у приблизно 1 мільйон ваш шанс на зіткнення числа mac становить 40%, на 2 мільйони - це вже 87%!

Якщо вам потрібна лише пара, це нормально, але коли ви підтримуєте ферму серверів із сотнями серверів, кожен з них розміщує десятки віртуальних машин, або якщо ви використовуєте macs як індекс у деяких db для бухгалтерії, і вам потрібні унікальні матеріали, будьте обережні. !


Дякую, за попередження про парадокс дня народження! У моєму випадку я ризикую, оскільки генерую близько 20 MAC-адрес.
Ерік Шьолунд

3
Якщо ви використовуєте сотні серверів, на яких розміщуються десятки віртуальних машин, все в одному домені широкомовної передачі, у вас є більші проблеми, ніж ризик зіткнення MAC-адреси.
живіт

1
" Це випливає з того, що навіть якщо у вас всього 23 людини, шанс вже становить 50%, що двоє з них мають день народження в один і той же день ". Це навіть не віддалено. Існує приблизно 50% шансів, що двоє з 23 людей мають таку ж річницю дня народження, а не той самий день народження.
Рон Моупін

5
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

Дякую MadHatter, я спробував ваш другий варіант, і він спрацював. Дуже хороша!
Ерік Шьолунд

5

Ці варіанти також працюють.

довше:

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

або коротше:

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

Споживання навантаження в обох варіантах дуже схоже за швидким вимірюванням часу.


Привіт Ентоні, я не бачу жодного іншого варіанту, що поєднує тут Opensl rand і sed, тому це унікальне рішення в цій темі.
Ярослав Кучера

Це правда. Він / вона використовували fold -w2|paste -sd: -замість sed. sedРішення, ймовірно , легше запам'ятати , як він використовує більш звичний інструмент - хоча я дізнався більше від його / її відповіді.
Ентоні Г - справедливість для Моніки

Я думаю, що перша команда не буде працювати, оскільки вона не встановлює рівний перший біт!
amrx

Привіт @amrx, ти впевнений, що перший біт MAC повинен бути рівним? У мене є NIC на одному з моїх серверів, який починається з ecтак 11101100 у двійковій ...
Ярослав Кучера

1
Привіт @JaroslavKucera, MAC-адреси Unicast ніколи не повинні встановлювати біт місця 1 у першому байті. Це біт "групи" (багатоадресна передача / трансляція). Якщо ви складаєте свою власну MAC-адресу, вам слід встановити біт місця 2 ("локально керований" біт) в першому байті, щоб відмежувати його від гарантованого глобально унікальної MAC-адреси.
amrx

4

Я знаю, що ця публікація стара, але для майбутніх відвідувачів, якщо ви хочете криптографічно захищену псевдослучайну 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'

2

Ось ще одна, заснована на відповіді жінки:

macaddr=$(dd if=/dev/urandom bs=1024 count=1 2>/dev/null|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5:\6/')
echo $macaddr

Немає необхідності запускати випадковий вихід через md5sum; ви можете просто використовувати od відповідно до відповіді Аарона Топонса.
живіт

2

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

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.


1

Ви можете просто додати $ RANDOM після $ FQDN, і це дасть вам випадкові mac адреси кожного разу, коли ви запускаєте його. Це особливо корисно для poeple, які хочуть створити резервну копію vms за допомогою знімків або клонів vms.

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

1
Зауважте, що $ RANDOM доступний у bash, але може бути недоступний в інших оболонках.
Майкл Хемптон


0

Пітон однолінійний:

python3 -c 'import os; print(":".join(["{:02x}".format(x) for x in b"\02x" + os.urandom(5)]))'

0

Для розваги, ось чиста версія баш-тестування, протестована на 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 :

Якщо провідним символом є одноцитата або подвійна цитата, значення має бути числовим значенням в базовому кодовому наборі символу, що слідує за одноцитатою або подвійною цитатою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.