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.
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:
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 02
primo 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.
tr -dc A-F0-9 < /dev/urandom | head -c 10 | sed -r 's/(..)/\1:/g;s/:$//;s/^/02:/'
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 !
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
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.
fold -w2|paste -sd: -
invece di sed
. La sed
soluzione è probabilmente più facile da ricordare in quanto utilizza uno strumento più familiare, anche se ho imparato di più dalla sua risposta.
ec
11101100 in binario ...
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'
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
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-
jot
viene fornito con OS X e BSD ma non con la maggior parte delle distribuzioni Linux. In jot
-w
cambia il formato, -s
cambia il separatore e -r
genera numeri casuali.
od
è in POSIX ma hexdump
non lo è.
OS X od
( /usr/bin/od
sotto) 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 od
opzioni 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/urandom
tempo indeterminato con OS X di od
.
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/')
Io uso:
echo -n 02; od -t x1 -An -N 5 /dev/urandom | tr ' ' ':'
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.