¿Cómo genero una dirección MAC aleatoria desde la línea de comandos de Linux?
Busco una solución que solo requiera herramientas estándar que se encuentran comúnmente en la línea de comandos de Linux.
La dirección MAC se usará para un KVM invitado.
¿Cómo genero una dirección MAC aleatoria desde la línea de comandos de Linux?
Busco una solución que solo requiera herramientas estándar que se encuentran comúnmente en la línea de comandos de Linux.
La dirección MAC se usará para un KVM invitado.
Respuestas:
yo suelo
macaddr=$(echo $FQDN|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')
El beneficio de este método, sobre un número completamente aleatorio, es que es posible reproducir de manera confiable la dirección MAC basada en el FQDN de la máquina, lo que a veces encuentro útil. El 02
primer octeto solo establece el bit "asignado localmente", lo que hace obvio que no es una dirección MAC proporcionada por el proveedor, y garantiza que no colisionará con una dirección MAC de una NIC real.
Si necesita generar múltiples direcciones MAC por host, solía concatenar el FQDN con el nombre del puente para conectar la interfaz; esto hizo un buen trabajo al difundir las cosas para diferentes NIC.
tr -dc A-F0-9 < /dev/urandom | head -c 10 | sed -r 's/(..)/\1:/g;s/:$//;s/^/02:/'
Los guiones publicados son buenos, pero quiero agregar una advertencia: ¡Cuidado con el cumpleaños (paradoja)!
Viene del hecho de que incluso si tiene solo 23 personas, la probabilidad de que 2 de ellos cumplan años el mismo día es ya del 50%.
Depende de su escenario cómo lo use, pero si genera el MACS al azar, con aproximadamente 1 millón, su probabilidad de un choque de números mac es del 40% a 2 millones, ¡ya es del 87%!
Si necesita solo un par, esto está bien, pero cuando mantiene una granja de servidores con cientos de servidores, cada uno de ellos aloja decenas de máquinas virtuales, o si usa los Mac como índice en alguna base de datos para la contabilidad y necesita exclusivos, tenga cuidado !
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 vieja motosierra del ejército suizo vuelve a montar. Y a través de la versión 0.2, estoy robando descaradamente el excelente punto de womble sobre el primer octeto que es 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
Estas variantes también funcionan.
más:
openssl rand -hex 6 | sed 's/\(..\)\(..\)\(..\)\(..\)\(..\)\(..\)/\1:\2:\3:\4:\5:\6/'
o más corto:
openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/:$//'
El consumo de carga de ambas variantes es muy similar según la medición rápida con el tiempo.
fold -w2|paste -sd: -
lugar de sed
. La sed
solución es probablemente más fácil de recordar, ya que utiliza una herramienta más familiar, aunque aprendí más de su respuesta.
ec
11101100 en binario ...
Sé que esta publicación es antigua, pero para futuros visitantes, si desea una dirección MAC pseudoaleatoria criptográficamente segura, sin limitarse a 0x02 como OUI, aquí hay un generador agnóstico de plataforma en su mayoría rápido:
$ 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'
Aquí hay otro, basado en la respuesta de wombie:
macaddr=$(dd if=/dev/urandom bs=1024 count=1 2>/dev/null|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5:\6/')
echo $macaddr
Aquí hay otras cinco opciones, todas las cuales usan bits aleatorios para el bit menos significativo del byte más significativo que indica si la dirección es unidifusión o multidifusión y para el segundo bit menos significativo del byte más significativo que indica si la dirección es administrada universal 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 con OS X y BSD pero no con la mayoría de las distribuciones de Linux. En jot
-w
cambia el formato, -s
cambia el separador y -r
genera números aleatorios.
od
está en POSIX pero hexdump
no lo está.
OS X od
( /usr/bin/od
abajo) usa un formato de salida diferente que 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
En las od
opciones de OS X colocadas después de un argumento para un archivo de entrada se tratan como los nombres de los archivos de entrada, por lo que el comando en la respuesta de Aaron Toponce se lee /dev/urandom
indefinidamente con OS X's od
.
Simplemente puede agregar un $ RANDOM después de $ FQDN y esto le daría direcciones MAC aleatorias cada vez que lo ejecute. Esto es especialmente útil para las personas que desean crear una copia de seguridad de vms utilizando instantáneas o clones de vms.
macaddr=$(echo $FQDN$RANDOM|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')
Yo suelo:
echo -n 02; od -t x1 -An -N 5 /dev/urandom | tr ' ' ':'
Solo por diversión, aquí hay una versión de bash puro, probada contra Bash 4.4.12 (1) -lanzamiento:
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 primera línea lee 6 caracteres de /dev/urandom
; luego, utilizando el juego de caracteres C, imprima el valor hexadecimal lleno de 0 de cada carácter separado con dos puntos (la nueva línea es opcional pero útil para imprimir el valor).
La extracción del valor de un carácter usando printf se define en la documentación POSIX printf :
Si el carácter inicial es una comilla simple o una comilla doble, el valor será el valor numérico en el conjunto de códigos subyacente del carácter que sigue a la comilla simple o la comilla doble.