¿Cómo puedo generar una dirección de mac aleatoria válida con bash?
La primera mitad de la dirección siempre debe permanecer igual así
00-60-2F-xx-xx-xx
solo el valor x debe generarse al azar?
bash
mac-address
NES
fuente
fuente
echo -n 00-60-2F; dd bs=1 count=3 if=/dev/random 2>/dev/null |hexdump -v -e '/1 "-%02X"'
Respuestas:
Aquí hay un pez.
Este script de shell generará la cadena aleatoria que busca:
Acabo de tener algo aquí que mostró cómo ejecutarlo desde la línea de comandos, pero después de mirar a Dennis Williamson una solución enrevesada (pero votada) veo que la respuesta que la gente espera es aquella en la que no tienen que hacer ningún trabajo sí mismos.
fuente
En el pasado hice esto usando:
pero eso solo los hará en el rango 0-9. Para mis propósitos, eso fue lo suficientemente bueno.
Probablemente una mejor solución sería usar printf:
Así es como funciona:
fuente
%02X
daría una letra mayúscula.O en python:
Tenga en cuenta que la versión de Python solo usa un campo de 16 de ancho para generar un carácter hexadecimal, por lo que no tiene que preocuparse por el relleno cero: enfoque modificado para abordar un comentario.
fuente
00-60-2F-8B-5-2C
,00-60-2F-A-71-97
,00-60-2F-82-F1-4
.Usando herramientas estándar, ya sea
o
podría ser el más corto de todos.
fuente
Las claves de la forma en que esto funciona:
LC_CTYPE=C
- permite caracteres> 0x7FIFS=
- desactiva la interpretación de\t
(tab),\n
(nueva línea) y espacio-d ''
- permite nuevas líneas-r
permite\
(y casi siempre debe usarse por hábito conread
)-%02x\n
hace que la salida sea un guión literal seguido de un número hexadecimal de dos dígitos que incluye un cero inicial, si corresponde. La nueva línea es superflua aquí y podría omitirse.read
consigue un solo byte (-n 1
) a partir de/dev/urandom
en el rango de 0 a 255 (00
aFF
).La comilla simple en el último argumento
printf
en el bucle hace que el carácter se muestre como su valor numérico ("A" se muestra como "65"). Consulte la especificación POSIX para saberprintf
dónde dice:fuente
IFS= read …
evitarse doblar 09 0a y 20 (los caracteres IFS habituales) en 00.-d ''
. Arreglaré mi respuesta. Gracias por hacérmelo saber.-r
cayó el que protege `\`. Desearía que el manejo adecuado de los datos binarios en los programas de shell no fuera tan complicado. ☺ Parece imposible representar con precisión 00 en el medio de la cadena. Su método de un solo carácter a la vez maneja 00 en virtud de la cooperación conveniente (¿diseñada?) Entre laread
interpolación de cadenas y cómoprintf
trata el argumento de un carácter'
. Suspiro.hexdump -C
.La forma más corta que pude encontrar fue usando hexdump directamente
Probado en GNU / Linux
fuente
hexdump -n3 -e'/3 "00-60-2F" 3/1 "-%02X"' /dev/random
es un poco más corto :-)Otra solución de una línea
Lo mismo en mayúsculas
Generarlo para una variable de entorno Bash
Detalles:
od (volcado octal)
-An
Suprime la representación de dirección principal (ruido adicional) de la salida.-N3
Limite la salida a tres bytes.-t xC
Salida en hexadecimal, estilo de caracteres ASCII, según se desee./dev/urandom
Pseudoarchivo de números aleatorios del kernel de Linux.sed (editor de flujo) Para la sustitución de espacios con guiones.
-e <SCRIPT>
ejecuta el script sed.tr (traducción de cadena) Opcional, en este ejemplo. Me gustan las direcciones MAC mayúsculas en mis scripts / entorno.
fuente
fuente
Esto debería funcionar
fuente
fuente
Este también funciona. La salida es todo en mayúsculas según sea necesario.
fuente
Esto funciona en el
#!/bin/sh
script clásico de shell ( ):O, si quieres tener un prefijo personalizado:
Ejemplo de uso:
fuente
Otra opción es usar
jot
:-w
cambia el formato,-s
cambia el separador y-r
genera números aleatorios.Los comandos que se utilizan
od
en las respuestas publicadas por artistoex y zero2cx agregan guiones adicionales a la salida con OS Xod
, pero esto no:OS X
od
(/usr/bin/od
abajo) usa un formato de salida diferente al de GNUod
:fuente
jot -w%02X -s- -r 3 1 256
ajot -w%02X -s- -r 3 0 256
.En Linux:
Explicación:
En Linux
/proc/sys/kernel/random/uuid
devuelve un nuevo UUID de tipo 4 (aleatorio) cada vez que lo lee. La mayoría de sus caracteres son dígitos hexadecimales (pseudo) aleatorios, por lo que podemos usarlos. P.ej:Ahora es suficiente imprimir
00-60-2f-
(sin nueva línea) primero:Pros:
printf
ycut
son herramientas POSIX;Contras:
/proc/sys/kernel/random/uuid
puede no estar disponible en algunos sistemas;fuente
Un trazador de líneas (bash)
resultado
fuente