Como remover caracteres irreconhecíveis da saída do terminal [closed]

0

Eu escrevi um pequeno script python que gera uma saída aleatória de seis caracteres. Ele gera saídas, mas a maioria delas possui caracteres irreconhecíveis, que aparecem como pequenas caixas com quatro caracteres. Existe alguma maneira de tirar isso? Se não, posso torná-los legíveis / reconhecíveis? Obrigado.

Script

import os
randomString = os.urandom(6)
print(randomString)

Saída da localidade

LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=en_US.UTF-8
LC_TIME=en_US.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=en_US.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=en_US.UTF-8
LC_NAME=en_US.UTF-8
LC_ADDRESS=en_US.UTF-8
LC_TELEPHONE=en_US.UTF-8
LC_MEASUREMENT=en_US.UTF-8
LC_IDENTIFICATION=en_US.UTF-8
LC_ALL=
    
por Null_Error 08.01.2017 / 17:59

2 respostas

3

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

    
por Byte Commander 08.01.2017 / 19:09
0

Você precisa ler cerca de 8 vezes mais bytes do que o número desejado de letras e dígitos e, em seguida, remover os bytes que não codificam letras ou dígitos.

Os caracteres quadrados bizarros com códigos internos aparecem porque sua localidade está definida como UTF-8, mas você está lendo bytes arbitrários de /dev/urandom , o que (obviamente) não respeita as regras da codificação UTF-8.

Eu não faço Python (mas vejo a edição no final desta resposta para código Python possivelmente feio), mas o objetivo é muito fácil de conseguir com um simples shell script. Para gerar senhas aleatórias contendo letras e dígitos, você pode usar algo como:

dd if=/dev/urandom bs=512 count=1 2>/dev/null |
tr -cd a-zA-Z0-9 |
cut -c 1-16 ; echo

De 512 bytes você pode extrair na média 124 letras e dígitos. (Existem 62 = 2 * 26 + 10 letras e dígitos nos 256 bytes diferentes que são gerados com a mesma probabilidade.)

Você pode querer alterar a-zA-Z0-9 para remover caracteres com aparência muito parecida. Você também pode querer alterar 16 se quiser senhas mais longas ou mais curtas.

Por exemplo, gere uma senha de 20 caracteres, eliminando caracteres que podem ser confundidos ( 0O , 1Il ):

$ dd if=/dev/urandom bs=512 count=1 2>/dev/null |
> tr -cd a-km-zA-HJ-NP-Z2-9 |
> cut -c 1-20 ; echo
JaQ2chDci4xVvzZuyGJm

(Esta é uma transcrição, os $ e > são prompts do shell.)

Edit: Este é o resultado das minhas habilidades em Python:

#! /usr/bin/env python
import os
import re
print(re.sub("[^a-zA-Z0-9]", "", os.urandom(256))[:6])
    
por AlexP 08.01.2017 / 18:57