Respostas:
random="$(dd if=/dev/urandom bs=3 count=1)"
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.
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:
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 comando stdout
.fold -w 3 | head -n 1
by por head -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.
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 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.
cat /dev/urandom | head -c 5 | base64
cat
lerá muito mais do que uma determinada quantidade de N
caracteres e pode esgotar a entropia. Resposta não útil.
cat
já que ambos base64
e head
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 $:
variable=`dd if=/dev/urandom bs=1 count=3`
Observe que provavelmente não será imprimível.
A solução mais fácil seria tão simples quanto:
$ head -cN /dev/urandom
$()
funciona?