¿Poner el contenido de /dev/urandom en una variable?

¿Poner el contenido de /dev/urandom en una variable?

Esta es una continuación de mi hilo anterior:- ¿Pasar el comando de fecha a una variable?

Bien, efectivamente me gustaría que /dev/urandom generara 4 dígitos para mí. Y colóquelos en una variable.

Aquí hay un ejemplo de mi script bash: -

#!/bin/bash
for (( c=0; c<=10; c++))
do
        a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4)"

        echo $a
done

La única razón por la que deseo hacer eco de los resultados es para poder ver que /dev/urandom ha generado 4 dígitos correctamente.

Para mi script bash que deseo crear, necesito hacerlo mediante programación ya que deseo realizar más operaciones en los resultados generados.

Así que no necesito "hacer eco" de los resultados. Asi esa="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4)"

¿Realmente colocando 4 dígitos aleatorios en la variable "a"? cuando hago eco de "a" de mi secuencia de comandos, aparece una consola bloqueada y tengo que usar "CTRL+C" para recuperar mi consola.

Todo lo que intento hacer es colocar 4 dígitos aleatorios de /dev/urandom en una variable.

Soy nuevo en bash scripting, así que todos los consejos son bienvenidos y gracias de antemano por cualquier ayuda o sugerencia.

Respuesta1

Si no necesita seguridad, puede usar la función integrada de bash.RANDOMvariable. Obtener un número aleatorio entre 0 y 9999 inclusive, $((RANDOM % 10000))genera un pequeño sesgo hacia valores menores que 767, porque los valores de $RANDOMson uniformes en el rango [0, 32767]. Para obtener una distribución uniforme y poner ceros a la izquierda:

while a=$((RANDOM + 10000)); ((a <= 39999)); do :; done
a=${a#?}

Tenga en cuenta nuevamente que esto no se aplica en ningún lugar donde la seguridad sea una preocupación. El resultado $RANDOMno es impredecible.

Si necesita seguridad, este /dev/urandomes el lugar adecuado para obtener datos aleatorios. Las llamadas foldson innecesarias en la mayoría de los Unices actuales: puedes capturar 4 caracteres con head -c.

a=$(</dev/urandom tr -dc 0-9 | head -c 4)

head -cno es POSIX y no está presente en OpenBSD, pero está presente en otros BSD y en Linux (ambos con GNU coreutils y BusyBox).

Si necesita portabilidad a sistemas que no la tienen head -c, entonces fold -w 4 | head -n 1un buen reemplazo es el estándar POSIX. Solo tenga en cuenta que necesita la headllamada; de lo contrario, foldseguirá generando líneas de 4 dígitos para siempre.

Respuesta2

foldsimplemente doblará el flujo infinito de dígitos y, por lo tanto, ase definirá indefinidamente. Necesitará agregar un comando de terminación, el más simple head:

 a="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4 | head -n1)"

Simplemente compare el comportamiento de estos dos comandos.

tr -dc '[:digit:]' < /dev/urandom | fold -w 4  
tr -dc '[:digit:]' < /dev/urandom | fold -w 4 | head -n1

El primero mostrará el flujo infinito de números aleatorios de 4 dígitos, mientras que el segundo abortará después de una línea.

información relacionada