come generare un indirizzo MAC casuale dalla riga di comando di Linux


26

Come posso generare un indirizzo MAC casuale dalla riga di comando di Linux?

Cerco una soluzione che richiede solo strumenti standard che si trovano comunemente sulla riga di comando di Linux.

L'indirizzo MAC verrà utilizzato per un KVM guest.

Risposte:


46

Io uso

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

Il vantaggio di questo metodo, su un numero completamente casuale, è che è possibile riprodurre in modo affidabile l'indirizzo MAC in base al nome FQDN della macchina, che trovo utile a volte. Il 02primo ottetto imposta semplicemente il bit "assegnato localmente", il che rende evidente che non è un indirizzo MAC fornito dal fornitore e garantisce che non si scontrerà con un indirizzo MAC di una NIC reale.

Se è necessario generare più indirizzi MAC per host, ho usato per concatenare il nome di dominio completo con il nome del bridge a cui collegare l'interfaccia; questo ha fatto un buon lavoro nel diffondere le cose per diverse schede di rete.


+1 per la riproducibilità; per alcune applicazioni, questo lo rende un metodo molto superiore al mio.
MadHatter supporta Monica il

Grazie mille, mi piace l'idea di averlo riproducibile.
Erik Sjölund,

Inoltre nessun conflitto di indirizzi mac nell'improbabile evento in cui avresti generato lo stesso mac in modo casuale due volte
Petter H

3
In alternativa puoi usaretr -dc A-F0-9 < /dev/urandom | head -c 10 | sed -r 's/(..)/\1:/g;s/:$//;s/^/02:/'
ALex_hha

1
È solo una "alternativa", nel senso che produce un risultato finale completamente diverso da quello che fa il mio snippet ...
womble

8

Gli script pubblicati sono buoni, ma voglio aggiungere un avvertimento: Mind the Birthday (paradosso)!

Viene dal fatto che anche se hai solo 23 persone, la probabilità è già del 50% che 2 di loro compiano lo stesso giorno.

Dipende dal tuo scenario come lo usi, ma se generi il MACS in modo casuale, a circa 1 milione di probabilità che si verifichi uno scontro di numeri mac sia del 40% a 2 milioni, è già dell'87%!

Se hai bisogno solo di un paio, va bene, ma quando mantieni una server farm con centinaia di server, ognuno di essi ospita decine di macchine virtuali, o se usi i mac come indice in alcuni db per la contabilità e hai bisogno di unici fai attenzione !


Grazie, per l'avvertimento sul paradosso del compleanno! Nel mio caso prenderò il rischio in quanto genererò circa 20 indirizzi MAC.
Erik Sjölund,

3
Se stai eseguendo centinaia di server, ciascuno dei quali ospita decine di macchine virtuali, tutte sullo stesso dominio di trasmissione, hai problemi più grandi del rischio di collisione dell'indirizzo MAC.
Womble

1
" Viene dal fatto che anche se hai solo 23 persone, la probabilità è già del 50% che 2 di loro festeggino lo stesso giorno. " Non è neanche lontanamente vero. C'è una probabilità del 50% che due persone su 23 abbiano lo stesso anniversario, non lo stesso compleanno.
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, la vecchia motosega dell'esercito svizzero cavalca di nuovo. E con la versione 0.2, sto spudoratamente rubando l'ottimo punto di Womble sul fatto che il primo ottetto è 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

Grazie MadHatter, ho provato la tua seconda variante e ha funzionato. Molto bella!
Erik Sjölund,

5

Anche queste varianti funzionano.

più a lungo:

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

o più corto:

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

Il consumo di carico di entrambe le varianti è molto simile in base alla misurazione rapida nel tempo.


Ciao Anthony, non vedo altre varianti che combinano openssl rand e sed qui, quindi questa è una soluzione unica in questo argomento.
Jaroslav Kucera,

È vero. Ha usato fold -w2|paste -sd: -invece di sed. La sedsoluzione è probabilmente più facile da ricordare in quanto utilizza uno strumento più familiare, anche se ho imparato di più dalla sua risposta.
Anthony G - giustizia per Monica,

Penso che il primo comando non funzionerà perché non imposta il primo bit per essere pari!
amrx,

Ciao @amrx, sei sicuro che il primo bit di MAC debba essere pari? Ho una scheda di rete in uno dei miei server, che inizia con ec11101100 in binario ...
Jaroslav Kucera,

1
Ciao @JaroslavKucera, gli indirizzi MAC Unicast non devono mai impostare il bit di posizione 1 nel primo byte. Questo è il bit "gruppo" (multicast / broadcast). Se crei il tuo indirizzo MAC, dovresti impostare il bit di posizione 2 (il bit "amministrato localmente") nel primo byte, per differenziarlo da un indirizzo MAC univoco globale garantito.
amrx,

4

So che questo post è vecchio, ma per i futuri visitatori, se vuoi un indirizzo MAC pseudocasuale crittograficamente sicuro, senza essere limitato a 0x02 come OUI, ecco un generatore agnostico veloce principalmente per piattaforme:

$ 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

Eccone un altro, basato sulla risposta di Wombie:

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

Non è necessario eseguire l'output urandom tramite md5sum; puoi semplicemente usare od secondo la risposta di Aaron Toponce.
Womble

2

Ecco altre cinque opzioni, che utilizzano tutti bit casuali per il bit meno significativo del byte più significativo che indica se l'indirizzo è unicast o multicast e per il secondo bit meno significativo del byte più significativo che indica se l'indirizzo è amministrato universalmente o localmente.

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-

jotviene fornito con OS X e BSD ma non con la maggior parte delle distribuzioni Linux. In jot -wcambia il formato, -scambia il separatore e -rgenera numeri casuali.

odè in POSIX ma hexdumpnon lo è.

OS X od( /usr/bin/odsotto) utilizza un formato di output diverso da 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 odopzioni effettuati dopo un argomento per un file di input sono trattati come i nomi dei file di input, così il comando nella risposta da Aaron Toponce legge da /dev/urandomtempo indeterminato con OS X di od.


1

Potresti semplicemente aggiungere un $ RANDOM dopo $ FQDN e questo ti darebbe indirizzi mac casuali ogni volta che lo eseguirai. Ciò è particolarmente utile per le persone che vogliono creare backup vms usando snapshot o cloni di vms.

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

1
Nota che $ RANDOM è disponibile in bash, ma potrebbe non essere disponibile in altre shell.
Michael Hampton


0

Python one-liner:

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

0

Solo per divertimento, ecco una versione bash pura, testata contro 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}"

La prima riga legge 6 caratteri da /dev/urandom; quindi utilizzando il set di caratteri C, stampare il valore esadecimale con riempimento 0 di ciascun carattere separato da due punti (la nuova riga è facoltativa ma utile per stampare il valore).

L'estrazione del valore di un carattere tramite printf è definita nella documentazione POSIX printf :

Se il carattere principale è una virgoletta singola o una virgoletta doppia, il valore deve essere il valore numerico nel set di codici sottostante del carattere che segue la virgoletta singola o la virgoletta doppia.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.