read /dev/urandom 3
O exemplo acima não está funcionando ... Como posso ler bytes aleatórios /dev/urandom
no bash?
bash
random-number-generator
linux
fonte
fonte
$()
funciona?It treats the output of a command like a variable.
você realmente quer dizer string, certo?$()
é bastante universal, não específico do bash. BTW, tenha cuidado para não ter limitações em quais caracteres o shell pode armazenar em variáveis - por exemplo, a versão do bash que testei deixa de fora nulos (\ x00) da string.(Se você deseja caracteres de traço literais, o caractere de traço deve ir no final da string, conforme feito acima, em oposição a
*-_
).E para explicar o que é feito devido ao conjunto de comandos acima:
head -c 500 /dev/urandom
: Obtenha os primeiros 500 caracteres (bytes) de/dev/urandom
.tr -dc 'a-zA-Z0-9~!@#$%^&*_-'
: Remova todos, exceto os caracteres especificados, na'a-zA-Z0-9~!@#$%^&*_-'
saída do primeiro comando.fold -w 3
: Formate a saída do segundo comando para que ele tenha 3 caracteres por linha.head -n 1
: Exibe a primeira linha do resultado do terceiro comandostdout
.fonte
fold -w 3 | head -n 1
by porhead -c 3
se o novo char de linha não for necessário no final.Illegal byte sequence
erro. Para corrigir isso, use a codificação "C"; altere o comando para:head -c 500 /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1
Por favor verifique
man od
.Você pode usar, por exemplo
od -vAn -N4 -tu4 < /dev/urandom
para gerar números aleatórios decimais não assinados de 4 bytes.
fonte
Aqui está um que cria cadeias base64, observe que, embora estejam limitadas às cadeias base64, o preenchimento é removido delas, para que você não possa decodificá-las, provavelmente não será necessário.
Substitua
5
pelo número de caracteres que você deseja.Se, no entanto, você precisar decodificá-los por algum motivo, vá
base64
para o final do tubo. Em seguida, ele coletará 5 caracteres do urandom e a base64 o codificará com o preenchimento correto, mas a sequência final poderá ser maior do que o desejado devido ao preenchimento.fonte
cat
lerá muito mais do que uma determinada quantidade deN
caracteres e pode esgotar a entropia. Resposta não útil.cat
já que ambosbase64
ehead
pode usar um nome de arquivo como argumento, nesse caso, ele funciona e não deve esgotar a entropia. Veja stackoverflow.com/questions/10031344/…Tente o seguinte:
dd if=/dev/urandom bs=1 count=3
Se você deseja colocar o resultado na variável $:
Observe que provavelmente não será imprimível.
fonte
A solução mais fácil seria tão simples quanto:
fonte