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 == .