Lendo um certo número de bytes da entrada padrão e fechando o tubo

1

Estou tentando ler alguns bytes de / dev / urandom, manter apenas os que posso digitar facilmente e aparar o resultado em 30 caracteres. Eu não consigo descobrir como obter o comportamento de "apenas 30 caracteres" quando os dados estão vindo de um canal. 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 ficam pendurados sem exibir nada. Por outro lado,

cut -c -30 /dev/urandom | tr -cd 'A-Za-z0-9'

gera dados indefinidamente (embora seja claramente processado por 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?

    
por bdesham 05.06.2018 / 21:19

2 respostas

2

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, pois tr remove qualquer nova linha e, portanto, cut nunca vê uma linha completa para processar. No último, o tr remove novamente as novas linhas para que você não veja como cut manteve as linhas com um determinado tamanho.

Supondo que seu utilitário head suporta a opção -c <characters> , você pode usá-lo para obter um número fixo de bytes. Se não, use dd . ( dd bs=1 count=NNN < /dev/urandom )

Então, isso produziria 32 alfanuméricos (e uma nova linha):

tr -cd 'A-Za-z0-9' < /dev/urandom | head -c32 ; echo

Embora, apenas por princípio, isso é um desperdício, pois o tr remove aproximadamente 3/4 ou os bytes de entrada brutos. Talvez seja melhor passar os dados brutos de urandom para algo como base64 ou qualquer coisa que produza um despejo hexadecimal.

    
por 05.06.2018 / 22:22
0

Uma maneira simples de transformar qualquer coisa em caracteres legíveis:

$ head -c30 /dev/urandom | base64
nkGmuXgY/1OfNz8i/t3MsVe/5Q0z18AKotV3oJRW
    
por 05.06.2018 / 21:23