¿Cómo leer en N caracteres aleatorios de / dev / urandom?

Respuestas:

44
random="$(dd if=/dev/urandom bs=3 count=1)"
Flimzy
fuente
1
@ Flimzy, ¿cómo $()funciona?
linux
2
Trata la salida de un comando como una variable. Nota: Eso es un bashismo. Si no está usando bash, es posible que deba usar `` en su lugar. `` es más universal, pero creo que $ () es más fácil de leer.
Flimzy
@Flimzy, en It treats the output of a command like a variable.realidad te refieres a una cuerda, ¿verdad?
linux
2
Una variable puede ser una cadena ... o un número. Lo trata como una variable ... luego, según el contexto, se trata como una cadena o un número.
Flimzy
1
$()es bastante universal, no específico de bash. Por cierto, tenga cuidado de no encontrarse con limitaciones sobre qué caracteres puede almacenar el shell en las variables, por ejemplo, la versión de bash que probé deja fuera los nulos (\ x00) de la cadena.
Gordon Davisson
46
head -c 500 /dev/urandom | tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1

(Si desea caracteres de guión literales, el carácter de guión debe ir al final de la cadena como se hizo anteriormente, en lugar de *-_).

Y para explicar lo que se hace debido al conjunto de comandos anterior:

  1. head -c 500 /dev/urandom: Obtenga los primeros 500 caracteres (bytes) de /dev/urandom.
  2. tr -dc 'a-zA-Z0-9~!@#$%^&*_-': Elimina todos los caracteres, excepto los especificados, 'a-zA-Z0-9~!@#$%^&*_-'de la salida del primer comando.
  3. fold -w 3: Formatee la salida del segundo comando de modo que tenga 3 caracteres por línea.
  4. head -n 1: Muestra la primera línea del resultado del tercer comando en stdout.
ADM
fuente
1
Está buscando 3 bytes ...
Chris S
1
3 más patrón exacto
ADM
Esto es excelente.
Danijel-James W
3
¡Excelente! También están disponibles los nombres de clase char ([: graph | print | etc:]) para la función tr, y podría simplificarse aún más si se reemplaza fold -w 3 | head -n 1por a head -c 3si no se necesita la nueva línea char al final.
Zimmi
55
Si la codificación predeterminada del sistema es multibyte (por ejemplo, UTF-8), tr fallará con un Illegal byte sequenceerror. Para arreglar eso, use la codificación "C"; cambie el comando a:head -c 500 /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1
devstuff
33

Por favor verifique man od.

Puedes usar, por ejemplo

od -vAn -N4 -tu4 < /dev/urandom

para generar números aleatorios decimales sin signo de 4 bytes.

Ekrem Aksoy
fuente
1
Ekrem, bienvenido a SF. Normalmente no prefiero las respuestas nuevas a las preguntas aceptadas desde hace mucho tiempo, pero esto es realmente diferente de todas las respuestas anteriores y tiene algunas ventajas reales, ¡genial! +1 de mi parte, y espero que te quedes en SF y contribuyas así durante algún tiempo.
MadHatter apoya a Monica el
19

Aquí hay uno que crea cadenas de base64, tenga en cuenta que a pesar de que están limitadas a cadenas de base64, el relleno se elimina de ellas, por lo que no puede decodificarlas, probablemente no lo necesitará de todos modos.

 cat /dev/urandom | base64 | head -c 5

Reemplace 5con la cantidad de caracteres que desea.

Sin embargo, si necesita decodificarlos por alguna razón, muévase base64al final de la tubería. Luego recopilará 5 caracteres de urandom y codificará en base64 con el relleno correcto, pero la cadena final puede ser más larga de lo que desea debido al relleno.

cat /dev/urandom | head -c 5 | base64
Umur Kontacı
fuente
Esto no es exactamente lo que preguntaba. Su respuesta aún puede ser útil, pero la pregunta no tiene suficiente contexto para decir con seguridad.
kasperd
1
@kasperd La pregunta pregunta (en el título) cómo leer N caracteres aleatorios de / dev / urandom pero en el cuerpo pide leer bytes. Estoy de acuerdo en que hay una inconsistencia. Llegué a esta pregunta de Google para leer personajes y creo que puede ayudar a los futuros visitantes como una opción.
Umur Kontacı
Creo que su respuesta es la más simple pero más fácil de entender. ¡Gracias!
Robert
1
El uso catleerá mucho más que una cantidad dada de Ncaracteres, y puede agotar la entropía. Respuesta no útil
Dr Beco
1
Si bien el Dr. Beco tiene razón en que esto es un abuso de catambos base64y headpuede tomar un nombre de archivo como argumento, en este caso funciona y no debería agotar la entropía. Ver stackoverflow.com/questions/10031344/…
J.Money
11

Prueba esto: dd if=/dev/urandom bs=1 count=3

Si quieres poner el resultado en $ variable:

variable=`dd if=/dev/urandom bs=1 count=3`

Tenga en cuenta que probablemente no será imprimible.

Eduardo Ivanec
fuente
¿Se puede usar también el comando para leer 3 bytes aleatorios de datos binarios?
Dimitrios Desyllas
6

La solución más fácil sería tan simple como:

$ head -cN /dev/urandom
Spack
fuente
2
¿Qué agrega esto a las respuestas ya dadas?
MadHatter apoya a Monica el
55
invocación más simple
m.kocikowski