Como ler N caracteres aleatórios no / dev / urandom?

50
read /dev/urandom 3

O exemplo acima não está funcionando ... Como posso ler bytes aleatórios /dev/urandomno bash?

linux
fonte

Respostas:

44
random="$(dd if=/dev/urandom bs=3 count=1)"
Flimzy
fonte
11
@ Flimzy, como $()funciona?
linux
2
Ele trata a saída de um comando como uma variável. Nota: Isso é um basismo. Se você não estiver usando o bash, pode ser necessário usar ``. `` é mais universal, mas acho que $ () é mais fácil de ler.
Flimzy
@ Flimzy, It treats the output of a command like a variable.você realmente quer dizer string, certo?
linux
2
Uma variável pode ser uma sequência ... ou um número. Trata-o como uma variável ... então, dependendo do contexto, é tratado como uma string ou um número.
Flimzy
11
$()é 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.
Gordon Davisson
46
head -c 500 /dev/urandom | tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1

(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:

  1. head -c 500 /dev/urandom: Obtenha os primeiros 500 caracteres (bytes) de /dev/urandom.
  2. tr -dc 'a-zA-Z0-9~!@#$%^&*_-': Remova todos, exceto os caracteres especificados, na 'a-zA-Z0-9~!@#$%^&*_-'saída do primeiro comando.
  3. fold -w 3: Formate a saída do segundo comando para que ele tenha 3 caracteres por linha.
  4. head -n 1: Exibe a primeira linha do resultado do terceiro comando stdout.
ADM
fonte
11
Ele está olhando para 3 bytes ...
Chris S
11
3 mais padrão exato
ADM
Isto e excelente.
Danijel-James W
3
Ótimo! Também existem os nomes das classes char ([: graph | print | etc:]) disponíveis para a função tr, e isso pode ser mais simplificado substituindo fold -w 3 | head -n 1by por head -c 3se o novo char de linha não for necessário no final.
Zimmi
5
Se a codificação padrão do sistema for multibyte (por exemplo, UTF-8), então tr falhará com um Illegal byte sequenceerro. 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
devstuff 10/11/2015
33

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.

Ekrem Aksoy
fonte
11
Ekrem, bem-vindo ao SF. Normalmente, não sou a favor de novas respostas para perguntas há muito aceitas, mas isso é realmente diferente de todas as respostas anteriores e tem algumas vantagens reais - bom! +1 de mim, e espero que você fique perto de SF e contribua dessa maneira por algum tempo.
MadHatter apoia Monica
19

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.

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

Substitua 5pelo número de caracteres que você deseja.

Se, no entanto, você precisar decodificá-los por algum motivo, vá base64para 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.

cat /dev/urandom | head -c 5 | base64
Umur Kontacı
fonte
Não é exatamente isso que a pergunta estava pedindo. Sua resposta ainda pode ser útil, mas a pergunta não tem contexto suficiente para dizer com certeza.
kasperd
11
@kasperd A questão pergunta (no título) como ler N caracteres aleatórios em / dev / urandom, mas no corpo pede leitura de bytes. Eu concordo que há uma inconsistência. Cheguei a esta pergunta do Google por ler caracteres e acho que isso pode ajudar os futuros visitantes como uma opção.
Umur Kontacı
Eu acho que sua resposta é a mais simples e mais fácil de entender. Obrigado!
Robert
11
O uso catlerá muito mais do que uma determinada quantidade de Ncaracteres e pode esgotar a entropia. Resposta não útil.
Dr Beco
11
Embora o Dr. Beco esteja certo de que isso é um abuso, catjá que ambos base64e headpode usar um nome de arquivo como argumento, nesse caso, ele funciona e não deve esgotar a entropia. Veja stackoverflow.com/questions/10031344/…
J.Money
11

Tente o seguinte: dd if=/dev/urandom bs=1 count=3

Se você deseja colocar o resultado na variável $:

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

Observe que provavelmente não será imprimível.

Eduardo Ivanec
fonte
O comando também pode ser usado para ler 3 bytes aleatórios de dados binários?
Dimitrios Desyllas
6

A solução mais fácil seria tão simples quanto:

$ head -cN /dev/urandom
Spack
fonte
2
O que isso acrescenta às respostas já dadas?
MadHatter apoia Monica
5
invocação mais simples
m.kocikowski