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?

Respostas:


44
random="$(dd if=/dev/urandom bs=3 count=1)"

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.

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.


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

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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.