Jak wygenerować losowy adres MAC z wiersza poleceń systemu Linux?
Poszukuję rozwiązania, które wymaga jedynie standardowych narzędzi powszechnie spotykanych w wierszu poleceń systemu Linux.
Adres MAC zostanie użyty dla gościa KVM.
Jak wygenerować losowy adres MAC z wiersza poleceń systemu Linux?
Poszukuję rozwiązania, które wymaga jedynie standardowych narzędzi powszechnie spotykanych w wierszu poleceń systemu Linux.
Adres MAC zostanie użyty dla gościa KVM.
Odpowiedzi:
używam
macaddr=$(echo $FQDN|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')
Zaletą tej metody, w porównaniu z całkowicie losową liczbą, jest to, że można niezawodnie odtworzyć adres MAC na podstawie nazwy FQDN komputera, co czasem uważam za przydatne. 02
Dla pierwszego oktetu prostu ustawia „lokalnie” przypisanego bitu, który sprawia, że jest oczywiste, że nie jest to adres MAC sprzedawca-pod warunkiem, i gwarantuje, że nie będzie kolidować z adresem MAC prawdziwym NIC za.
Jeśli chcesz wygenerować wiele adresów MAC na host, użyłem do połączenia nazwy FQDN z nazwą mostu, z którym ma zostać podłączony interfejs; dobrze to rozłożyło na różne karty sieciowe.
tr -dc A-F0-9 < /dev/urandom | head -c 10 | sed -r 's/(..)/\1:/g;s/:$//;s/^/02:/'
Opublikowane skrypty są dobre, ale chcę dodać ostrzeżenie: Mind the Birthday (paradoxon)!
Wynika to z faktu, że nawet jeśli masz tylko 23 osoby, szansa wynosi już 50%, że 2 z nich mają urodziny tego samego dnia.
Zależy to od scenariusza, w jaki sposób go używasz, ale jeśli wygenerujesz MACS losowo, przy około 1 milionie szansa na starcie liczby mac wynosi 40% przy 2 milionach, to już 87%!
Jeśli potrzebujesz tylko kilku, jest to w porządku, ale jeśli utrzymujesz farmę serwerów z setkami serwerów, każdy z nich obsługuje dziesiątki maszyn wirtualnych lub jeśli używasz macs jako indeksu w niektórych bazach danych do księgowości i potrzebujesz unikatów, bądź ostrożny !
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
Ach, stara szwajcarska piła łańcuchowa znów jeździ. I w wersji 0.2 bez skrępowania kradnę doskonały punkt womble dotyczący pierwszego oktetu jako 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
Te warianty również działają.
dłużej:
openssl rand -hex 6 | sed 's/\(..\)\(..\)\(..\)\(..\)\(..\)\(..\)/\1:\2:\3:\4:\5:\6/'
lub krócej:
openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/:$//'
Zużycie obciążenia w obu wariantach jest bardzo podobne według szybkiego pomiaru w czasie.
fold -w2|paste -sd: -
zamiast sed
. sed
Rozwiązanie jest chyba łatwiejsze do zapamiętania, ponieważ używa bardziej znajome narzędzia - choć dowiedziałem się więcej z jego / jej odpowiedź.
ec
kartę sieciową na jednym z moich serwerów, który zaczyna się od 11101100 w wersji binarnej ...
Wiem, że ten post jest stary, ale dla przyszłych gości, jeśli chcesz kryptograficznie bezpieczny pseudolosowy adres MAC, bez ograniczenia do 0x02 jako OUI, oto szybki, głównie platformowy generator agnostyczny:
$ 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'
Oto kolejna, oparta na odpowiedzi wombie:
macaddr=$(dd if=/dev/urandom bs=1024 count=1 2>/dev/null|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5:\6/')
echo $macaddr
Oto pięć innych opcji, z których wszystkie używają losowych bitów dla najmniej znaczącego bitu najbardziej znaczącego bajtu, który wskazuje, czy adres jest emisji pojedynczej czy multiemisji, oraz dla drugiego najmniej znaczącego bitu najbardziej znaczącego bajtu, który wskazuje, czy adres jest administrowany uniwersalnie lub lokalnie.
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
jest dostarczany z OS X i BSD, ale nie z większością dystrybucji Linuksa. W jot
-w
zmienia format, -s
zmienia separator i -r
generuje losowe liczby.
od
jest w POSIX, ale go hexdump
nie ma.
OS X od
( /usr/bin/od
poniżej) używa innego formatu wyjściowego niż 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
W OS X od
opcje umieszczone po argumencie dla pliku wejściowego są traktowane jak nazwy plików wejściowych, więc polecenie w odpowiedzi Aarona Toponce czyta /dev/urandom
z OS X w nieskończoność od
.
Możesz po prostu dodać $ RANDOM po $ FQDN, a to da ci losowe adresy mac przy każdym uruchomieniu. Jest to szczególnie przydatne dla osób, które chcą tworzyć kopie zapasowe vms przy użyciu migawek lub klonów vms.
macaddr=$(echo $FQDN$RANDOM|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')
Używam:
echo -n 02; od -t x1 -An -N 5 /dev/urandom | tr ' ' ':'
Dla zabawy, oto wersja czysto bashowa, przetestowana na Bash 4.4.12 (1) - wydanie:
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}"
Pierwszy wiersz odczytuje 6 znaków z /dev/urandom
; następnie używając zestawu znaków C wypisz 0-szesnastkową wartość każdego znaku oddzielonego dwukropkiem (nowa linia jest opcjonalna, ale przydatna do wydrukowania wartości).
Wyodrębnianie wartości znaku za pomocą printf jest zdefiniowane w dokumentacji printf POSIX :
Jeżeli wiodącym znakiem jest pojedynczy cudzysłów lub podwójny cudzysłów, wartością jest wartość liczbowa w podstawowym zestawie znaków znaku następującego po pojedynczym cudzysłowie lub podwójnym cudzysłowie.