Estou tentando ler alguns bytes de /dev/urandom, manter apenas os que posso digitar facilmente e cortar o resultado para 30 caracteres. Não consigo descobrir como obter o comportamento de “apenas 30 caracteres” quando os dados estão vindo de um pipe, no entanto. eu tentei
cat /dev/urandom | tr -cd 'A-Za-z0-9' | cut -c -30
e
cut -c -30 /dev/urandom | tr -cd 'A-Za-z0-9' | cut -c -30
mas estes travam sem exibir nada. Por outro lado,
cut -c -30 /dev/urandom | tr -cd 'A-Za-z0-9'
produz dados infinitamente (embora tenha sido claramente processado tr
porque apenas os caracteres especificados aparecem na saída).
Em geral, como posso ler um certo número de caracteres (ou bytes) de um pipe e depois fechar o pipe?
cut
lerá a entrada até o final do arquivo e cortará uma parte de cada linha. Com os dois primeiros comandos, você não vê nada, poistr
remove todas as novas linhas e, portanto,cut
nunca vê uma linha completa para processar. No último, otr
novamente remove as novas linhas para que você não veja comocut
as linhas foram mantidas em um determinado comprimento.Supondo que seu
head
utilitário suporte a opção, você pode usá-lo para obter um número fixo de bytes. Se isso não acontecer, use . ( )-c <characters>
dd
dd bs=1 count=NNN < /dev/urandom
Portanto, isso produziria 32 alfanuméricos (e uma nova linha à direita):
No entanto, apenas por princípio, isso é um desperdício, já que
tr
joga fora cerca de 3/4 ou os bytes de entrada brutos. Pode ser melhor passar os dados brutosurandom
para algo comobase64
ou qualquer coisa que produza um dump hexadecimal.Uma maneira simples de transformar qualquer coisa em caracteres legíveis: