So generieren Sie eine zufällige MAC-Adresse über die Linux-Befehlszeile

26

Wie erstelle ich eine zufällige MAC-Adresse über die Linux-Befehlszeile?

Ich suche nach einer Lösung, die nur Standardtools benötigt, die häufig in der Linux-Befehlszeile zu finden sind.

Die MAC-Adresse wird für ein Gast-KVM verwendet.

Erik Sjölund
quelle

Antworten:

46

ich benutze

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

Der Vorteil dieser Methode gegenüber einer vollständig zufälligen Zahl ist, dass es möglich ist, die MAC-Adresse basierend auf dem FQDN des Computers zuverlässig zu reproduzieren, was ich manchmal nützlich finde. Das 02für das erste Oktett setzt nur das "lokal zugewiesene" Bit, was deutlich macht, dass es sich nicht um eine vom Hersteller bereitgestellte MAC-Adresse handelt und garantiert, dass Sie nicht mit der MAC-Adresse einer echten Netzwerkkarte kollidieren.

Wenn Sie mehrere MAC-Adressen pro Host generieren müssen, habe ich den FQDN mit dem Namen der Bridge verkettet, mit der die Schnittstelle verbunden werden soll. Dies hat eine gute Arbeit geleistet, um Dinge für verschiedene Netzwerkkarten zu verbreiten.

womble
quelle
+1 für die Reproduzierbarkeit; Für bestimmte Anwendungen ist es daher meiner Methode weit überlegen.
MadHatter unterstützt Monica
Vielen Dank, ich mag die Idee, es reproduzierbar zu machen.
Erik Sjölund
Außerdem gibt es keine Mac-Adressenkonflikte in dem unwahrscheinlichen Fall, dass Sie denselben Mac zweimal zufällig generieren würden
Petter H,
3
Als Alternative können Sietr -dc A-F0-9 < /dev/urandom | head -c 10 | sed -r 's/(..)/\1:/g;s/:$//;s/^/02:/'
ALex_hha
1
Es ist nur eine "Alternative" in dem Sinne, dass es ein völlig anderes Endergebnis liefert als das, was mein Snippet macht ...
womble
8

Die geposteten Skripte sind gut, aber ich möchte eine Warnung hinzufügen: Mind the Birthday (paradoxon)!

Es kommt daher, dass selbst wenn Sie nur 23 Leute haben, die Chance bereits 50% ist, dass 2 von ihnen am selben Tag Geburtstag haben.

Es hängt von Ihrem Szenario ab, wie Sie es verwenden, aber wenn Sie das MACS zufällig generieren, beträgt Ihre Chance für einen Mac-Nummern-Konflikt bei ca. 1 Million 40%, bei 2 Millionen sind es bereits 87%!

Wenn Sie nur ein paar benötigen, ist dies in Ordnung. Wenn Sie jedoch eine Serverfarm mit Hunderten von Servern unterhalten, von denen jeder Dutzende virtueller Maschinen hostet, oder wenn Sie die Macs als Index in einer Datenbank für die Buchhaltung verwenden und Unikate vorsichtig sein müssen !

Flolo
quelle
Vielen Dank für die Warnung vor dem Geburtstagsparadoxon! In meinem Fall gehe ich das Risiko ein, da ich ungefähr 20 MAC-Adressen generiere.
Erik Sjölund
3
Wenn Sie Hunderte von Servern ausführen, auf denen jeweils zehn virtuelle Maschinen in derselben Broadcast-Domäne gehostet werden, besteht ein höheres Risiko als das Risiko von MAC-Adressenkollisionen.
womble
1
" Es kommt von der Tatsache, dass selbst wenn Sie nur 23 Leute haben, die Chance bereits 50% ist, dass 2 von ihnen am gleichen Tag Geburtstag haben. " Das ist nicht einmal im entferntesten wahr. Es besteht eine 50% ige Wahrscheinlichkeit, dass zwei von 23 Personen denselben Geburtstag haben und nicht denselben Geburtstag.
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

Ah, die alte Schweizer Kettensäge reitet wieder. Und mit Version 0.2 klaue ich schamlos Wombles hervorragenden Punkt, dass das erste Oktett 02 ist:

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 unterstützt Monica
quelle
Danke MadHatter, ich habe deine zweite Variante ausprobiert und es hat funktioniert. Sehr schön!
Erik Sjölund
5

Diese Varianten funktionieren auch.

länger:

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

oder kürzer:

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

Der Lastverbrauch beider Varianten ist laut Schnellmessung mit der Zeit sehr ähnlich.

Jaroslav Kucera
quelle
Hallo Anthony, ich sehe hier keine andere Variante, die openssl rand und sed kombiniert, also ist dies eine einzigartige Lösung in diesem Thema.
Jaroslav Kucera
Das ist richtig. Er / sie verwendete fold -w2|paste -sd: -statt sed. Die sedLösung ist wahrscheinlich leichter zu merken, da sie ein vertrauteres Tool verwendet - obwohl ich aus seiner / ihrer Antwort mehr gelernt habe.
Anthony G - Gerechtigkeit für Monica
Ich denke, der erste Befehl wird nicht funktionieren, weil er das erste Bit nicht auf gerade setzt!
Amrx
Hallo @amrx, bist du sicher, dass das erste MAC-Bit gerade sein muss? Ich habe NIC in einem meiner Server, die mit ecso 11101100 in binären beginnt ...
Jaroslav Kucera
1
Hi @JaroslavKucera, Unicast-MAC-Adressen dürfen niemals das 1-Bit im ersten Byte setzen. Das ist das "Gruppen" -Bit (Multicast / Broadcast). Wenn Sie Ihre eigene MAC-Adresse erstellen, müssen Sie im ersten Byte das 2-Stellen-Bit (das "lokal verwaltete" Bit) setzen, um es von einer garantierten, global eindeutigen MAC-Adresse zu unterscheiden.
Amrx
4

Ich weiß, dass dieser Beitrag alt ist, aber für zukünftige Besucher, wenn Sie eine kryptografisch sichere pseudozufällige MAC-Adresse möchten, ohne auf 0x02 als OUI beschränkt zu sein, ist hier ein schneller, meist plattformunabhängiger Generator:

$ 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
quelle
2

Hier ist eine andere, basierend auf der Antwort von 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
quelle
Es ist nicht erforderlich, die Urandom-Ausgabe über md5sum auszuführen. Sie können nur OD gemäß der Antwort von Aaron Toponce verwenden.
womble
2

Hier sind fünf weitere Optionen, die alle Zufallsbits für das niedrigstwertige Bit des höchstwertigen Bytes verwenden, das angibt, ob die Adresse Unicast oder Multicast ist, und für das zweitniedrigstwertige Bit des höchstwertigen Bytes, das angibt, ob die Adresse ist universell oder lokal verwaltet.

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-

jotkommt mit OS X und BSDs, aber nicht mit den meisten Linux-Distributionen. In jot -wändert das Format -sändert den Separator und -rerzeugt Zufallszahlen.

odist in POSIX aber hexdumpnicht.

OS X od( /usr/bin/odunten) verwendet ein anderes Ausgabeformat als 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

In OS X werden odOptionen, die nach einem Argument für eine Eingabedatei platziert werden, als Namen von Eingabedateien behandelt, sodass der Befehl in der Antwort von Aaron Toponce für /dev/urandomunbestimmte Zeit mit OS X gelesen wird od.

Nisetama
quelle
1

Sie könnten einfach ein $ RANDOM nach $ FQDN hinzufügen und dies würde Ihnen bei jeder Ausführung zufällige Mac-Adressen geben. Dies ist besonders hilfreich für Benutzer, die Sicherungs-VMs mit Snapshots oder Klonen von VMs erstellen möchten.

macaddr=$(echo $FQDN$RANDOM|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')
Quecksilber
quelle
1
Beachten Sie, dass $ RANDOM in bash verfügbar ist, in anderen Shells jedoch möglicherweise nicht.
Michael Hampton
0

Ich benutze:

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

Python Einzeiler:

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

Nur zum Spaß ist hier eine reine Bash-Version, getestet gegen Bash 4.4.12 (1) -Release:

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}"

Erste Zeile liest 6 Zeichen aus /dev/urandom; Verwenden Sie dann den C-Zeichensatz, und geben Sie den mit 0 gefüllten Hex-Wert jedes Zeichens aus, der durch einen Doppelpunkt getrennt ist.

Das Extrahieren des Werts eines Zeichens mit printf wird in der POSIX- printf- Dokumentation definiert:

Wenn das führende Zeichen ein einfaches Anführungszeichen oder ein doppeltes Anführungszeichen ist, ist der Wert der numerische Wert im zugrunde liegenden Codesatz des Zeichens, das auf das einfache Anführungszeichen oder das doppelte Anführungszeichen folgt.

Thomas Guyot-Sionnest
quelle