jak wygenerować losowy adres MAC z wiersza poleceń systemu Linux

26

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.

Erik Sjölund
źródło

Odpowiedzi:

46

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. 02Dla 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.

womble
źródło
+1 za odtwarzalność; w przypadku niektórych aplikacji jest to metoda znacznie lepsza od mojej.
MadHatter obsługuje Monikę
Wielkie dzięki, podoba mi się pomysł, aby był odtwarzalny.
Erik Sjölund,
Plus konflikty adresów bez mac w mało prawdopodobnym przypadku, że losowo wygenerowałbyś dwa razy to samo mac
Petter H
3
Alternatywnie możesz użyćtr -dc A-F0-9 < /dev/urandom | head -c 10 | sed -r 's/(..)/\1:/g;s/:$//;s/^/02:/'
ALex_hha
1
To tylko „alternatywa” w tym sensie, że daje zupełnie inny efekt końcowy niż to, co robi mój fragment…
womble
8

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 !

flolo
źródło
Dzięki za ostrzeżenie o paradoksie urodzinowym! W moim przypadku podejmę ryzyko, ponieważ wygeneruję około 20 adresów MAC.
Erik Sjölund,
3
Jeśli korzystasz z setek serwerów, z których każdy obsługuje dziesiątki maszyn wirtualnych w tej samej domenie rozgłoszeniowej, masz większe problemy niż ryzyko kolizji adresów MAC.
womble
1
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. ” To nawet nie jest prawdą. Istnieje około 50% szans, że dwie z 23 osób będą obchodzić tę samą rocznicę urodzin, a nie te same urodziny.
Ron Maupin
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

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
MadHatter obsługuje Monikę
źródło
Dzięki MadHatter, wypróbowałem twój drugi wariant i zadziałał. Bardzo dobrze!
Erik Sjölund,
5

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.

Jaroslav Kucera
źródło
Cześć Anthony, nie widzę tutaj żadnego innego wariantu łączącego openssl rand i sed, więc jest to unikalne rozwiązanie w tym temacie.
Jaroslav Kucera
To prawda. On / ona użyła fold -w2|paste -sd: -zamiast sed. sedRozwiązanie jest chyba łatwiejsze do zapamiętania, ponieważ używa bardziej znajome narzędzia - choć dowiedziałem się więcej z jego / jej odpowiedź.
Anthony G - sprawiedliwość dla Moniki
Myślę, że pierwsze polecenie nie zadziała, ponieważ nie ustawia pierwszego bitu na parzysty!
amrx
Cześć @amrx, czy na pewno pierwszy bit MAC musi być parzysty? Mam eckartę sieciową na jednym z moich serwerów, który zaczyna się od 11101100 w wersji binarnej ...
Jaroslav Kucera
1
Cześć @JaroslavKucera, adresy MAC Unicast nigdy nie mogą ustawiać bitu miejsca 1 w pierwszym bajcie. To jest bit „grupowy” (multicast / broadcast). Jeśli tworzysz własny adres MAC, musisz ustawić bit miejsca 2 (bit „administrowany lokalnie”) w pierwszym bajcie, aby odróżnić go od gwarantowanego globalnie unikatowego adresu MAC.
amrx
4

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'
Aaron Toponce
źródło
2

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
gucki
źródło
Nie ma potrzeby uruchamiania danych wyjściowych w formacie md5sum; możesz po prostu użyć od zgodnie z odpowiedzią Aarona Toponce.
womble
2

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-

jotjest dostarczany z OS X i BSD, ale nie z większością dystrybucji Linuksa. W jot -wzmienia format, -szmienia separator i -rgeneruje losowe liczby.

odjest w POSIX, ale go hexdumpnie ma.

OS X od( /usr/bin/odponiż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 odopcje umieszczone po argumencie dla pliku wejściowego są traktowane jak nazwy plików wejściowych, więc polecenie w odpowiedzi Aarona Toponce czyta /dev/urandomz OS X w nieskończoność od.

nisetama
źródło
1

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/')
Rtęć
źródło
1
Zauważ, że $ RANDOM jest dostępny w wersji bash, ale może nie być dostępny w innych powłokach.
Michael Hampton
0

Używam:

echo -n 02; od -t x1 -An -N 5 /dev/urandom | tr ' ' ':'
Jérôme Pouiller
źródło
0

Python one-liner:

python3 -c 'import os; print(":".join(["{:02x}".format(x) for x in b"\02x" + os.urandom(5)]))'
presto8
źródło
0

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.

Thomas Guyot-Sionnest
źródło