Colocando o conteúdo de /dev/urandom em uma variável?

Colocando o conteúdo de /dev/urandom em uma variável?

Esta é uma continuação do meu tópico anterior: - Passando o comando de data para uma variável?

Ok, então, efetivamente, gostaria que /dev/urandom gerasse 4 dígitos para mim. E coloque-os em uma variável.

Aqui está um exemplo do meu script bash: -

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

        echo $a
done

A única razão pela qual desejo "ecoar" os resultados é para que eu possa realmente ver que /dev/urandom gerou 4 dígitos para mim corretamente.

Para o meu script bash que desejo fazer, preciso fazer isso programaticamente, pois desejo realizar outras operações nos resultados gerados.

Portanto, não preciso "ecoar" os resultados. assim éa="$(tr -dc '[:digit:]' < /dev/urandom | fold -w 4)"

Na verdade, colocando 4 dígitos aleatórios na variável "a"? quando eu ecoo "a" do meu script, recebo um console suspenso e preciso usar "CTRL + C" para trazer meu console de volta.

Tudo o que estou tentando fazer é colocar 4 dígitos aleatórios de /dev/urandom em uma variável.

Sou novo em scripts bash, então todos os conselhos são bem-vindos e agradeço antecipadamente por qualquer ajuda ou sugestão.

Responder1

Se você não precisa de segurança, você pode usar o recurso interno do bashRANDOMvariável. Para obter um número aleatório entre 0 e 9999 inclusive, $((RANDOM % 10000))há uma pequena tendência para valores menores que 767, porque os valores de $RANDOMsão uniformes no intervalo [0, 32767]. Para obter uma distribuição uniforme e colocar zeros à esquerda:

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

Observe novamente que isso não se aplica em nenhum lugar em que a segurança seja uma preocupação. A saída de $RANDOMnão é imprevisível.

Se você precisa de segurança, este /dev/urandomé o lugar certo para obter dados aleatórios. Chamar foldé desnecessário na maioria das unidades atuais: você pode pegar 4 caracteres com head -c.

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

head -cnão é POSIX e não está presente no OpenBSD, mas está presente em outros BSD e no Linux (ambos com GNU coreutils e BusyBox).

Se você precisa de portabilidade para sistemas que não possuem head -c, então fold -w 4 | head -n 1é um bom substituto o padrão POSIX. Observe que você precisa da headchamada, caso contrário, foldcontinuará gerando linhas de 4 dígitos para sempre.

Responder2

foldirá apenas dobrar o fluxo infinito de dígitos e, portanto, aestá sendo definido indefinidamente. Você precisará adicionar um comando de finalização, mais simples head:

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

Basta comparar o comportamento desses dois comandos

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

O primeiro mostrará o fluxo infinito de números aleatórios de 4 dígitos, enquanto o segundo será abortado após uma linha.

informação relacionada