Як створити випадкову MAC-адресу з командного рядка Linux?
Я шукаю рішення, яке вимагає лише стандартних інструментів, які зазвичай зустрічаються в командному рядку Linux.
MAC-адреса використовуватиметься для запрошеного KVM.
Як створити випадкову MAC-адресу з командного рядка Linux?
Я шукаю рішення, яке вимагає лише стандартних інструментів, які зазвичай зустрічаються в командному рядку Linux.
MAC-адреса використовуватиметься для запрошеного KVM.
Відповіді:
я використовую
macaddr=$(echo $FQDN|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')
Перевага цього методу над цілком випадковим числом полягає в тому, що можна надійно відтворити MAC-адресу на основі FQDN машини, що іноді я вважаю корисним. 02
Для першого октету просто встановлює «локально призначений» біт, що робить очевидним , що це не від постачальника при умови , MAC - адреса, і гарантує , що ви не будете мати справу з MAC - адресою справжньою Виконавця.
Якщо вам потрібно генерувати декілька MAC-адрес на один хост, я використовував для з'єднання FQDN з ім'ям мосту для підключення інтерфейсу; це зробило гарну роботу по поширенню речей для різних НІК.
tr -dc A-F0-9 < /dev/urandom | head -c 10 | sed -r 's/(..)/\1:/g;s/:$//;s/^/02:/'
Опубліковані сценарії хороші, але я хочу додати попередження: Пам'ятай про день народження (парадоксон)!
Це випливає з того, що навіть якщо у вас всього 23 людини, шанс вже на 50%, що 2 з них мають день народження в той же день.
Це залежить від вашого сценарію, як ви його використовуєте, але якщо ви генеруєте MACS випадковим чином, у приблизно 1 мільйон ваш шанс на зіткнення числа mac становить 40%, на 2 мільйони - це вже 87%!
Якщо вам потрібна лише пара, це нормально, але коли ви підтримуєте ферму серверів із сотнями серверів, кожен з них розміщує десятки віртуальних машин, або якщо ви використовуєте macs як індекс у деяких db для бухгалтерії, і вам потрібні унікальні матеріали, будьте обережні. !
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'
Ось ще одна, заснована на відповіді жінки:
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 адреси кожного разу, коли ви запускаєте його. Це особливо корисно для poeple, які хочуть створити резервну копію 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 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 :
Якщо провідним символом є одноцитата або подвійна цитата, значення має бути числовим значенням в базовому кодовому наборі символу, що слідує за одноцитатою або подвійною цитатою.