Para gerar uma string alfanumérica aleatória usando o RNG do sistema ( /dev/urandom
) no Python, provavelmente você deve usar melhor o random.SystemRandom
:
#!/usr/bin/env python3
import random, string
RNG = random.SystemRandom() # Random Number Generator
characters = string.ascii_letters + string.digits # allowed characters
# build a string by choosing a random character from 'characters' 6 times:
s = "".join(RNG.choice(characters) for n in range(6))
print(s)
O método acima permite que você especifique exatamente quais caracteres são permitidos e garante que sua string de saída tenha exatamente o tamanho desejado.
Eu decidi por string.ascii_letters + string.digits
neste exemplo, o que resulta em abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
.
No entanto, você também pode usar seu próprio script pequeno (ou ler diretamente 6 bytes de /dev/urandom
usando o comando head -c 6 /dev/urandom
) e filtrar a saída para mostrar apenas caracteres alfanuméricos usando tr
:
python3 your_script.py | tr -cd '[:alnum:]' ; echo
head -c 6 /dev/urandom | tr -cd '[:alnum:]' ; echo
O comando tr
exclui ( -d
) todos os caracteres que não são ( -c
= complemento) no conjunto de caracteres especificado '[:alnum:]'
, que é um atalho especial para todos os caracteres alfanuméricos.
O echo
no final simplesmente produz uma quebra de linha.
A desvantagem disso é que sua string de saída tem um comprimento indefinido, porque você não pode saber quantos caracteres válidos existirão na saída.
No entanto, se você ler diretamente a partir de /dev/urandom
sem Python, poderá inverter a ordem do pipe como abaixo para continuar filtrando bytes aleatórios até que a saída tenha o tamanho desejado:
tr -cd '[:alnum:]' < /dev/urandom | head -c 6 ; echo
Como alternativa, você também pode transformar dados binários em caracteres legíveis simplesmente codificando-os em base64
, que é um conjunto de caracteres de a-z
, A-Z
, 0-9
, /
e +
:
python3 your_script.py | base64
head -c 6 /dev/urandom | base64
Observe que o tamanho de uma string base64
codificada é sempre maior que o tamanho dos dados originais em bytes. A saída base64
também terminará sempre com ==
.