Как удалить все неузнаваемые символы из вывода терминала [closed]

Я написал короткий скрипт на Python, который генерирует случайный вывод из шести символов. Он генерирует выходные данные, но большинство из них имеют неузнаваемые символы, которые представляют собой маленькие прямоугольники с четырьмя символами в них. Есть ли способ избавиться от них? Если нет, могу ли я сделать их читаемыми / узнаваемыми? Спасибо.

Сценарий

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

Вывод локали

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=
0
задан 8 January 2017 в 10:05

2 ответа

Генерировать случайную алфавитно-цифровую строку с помощью RNG системы (/dev/urandom) в Python необходимо, вероятно, лучше использовать 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)

Метод выше позволяет Вам точно указывать, какие символы позволяются, и гарантирует, что Ваша выходная строка имеет точно желаемую длину.

Я решил для string.ascii_letters + string.digits в этом примере, который приводит к abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.


Однако Вы могли также использовать свой собственный маленький сценарий (или непосредственно считать 6 байтов из /dev/urandom использование команды head -c 6 /dev/urandom) и отфильтруйте вывод, чтобы только показать использование алфавитно-цифровых символов tr:

python3 your_script.py | tr -cd '[:alnum:]' ; echo
head -c 6 /dev/urandom | tr -cd '[:alnum:]' ; echo

tr команда удаляет (-d) все символы, которые не являются (-c = дополнение) в указанном наборе символов '[:alnum:]' который является специальным сокращением от всех алфавитно-цифровых символов.

echo в конце просто производит разрыв строки.

Недостаток этого - то, что Ваша выходная строка имеет неопределенную длину, потому что Вы не можете знать, сколькими допустимые символы там будут в выводе.

Однако, если Вы непосредственно читаете из /dev/urandom без Python можно инвертировать порядок канала как ниже, чтобы продолжать фильтровать случайные байты, пока вывод не имеет желаемую длину:

tr -cd '[:alnum:]' < /dev/urandom | head -c 6 ; echo

С другой стороны, можно также превратить любые двоичные данные в читаемые символы путем простого кодирования его в base64, который является набором символов a-z, A-Z, 0-9, / и +:

python3 your_script.py | base64
head -c 6 /dev/urandom | base64

Обратите внимание что длина a base64 закодированная строка всегда больше, чем длина исходных данных в байтах. base64 вывод будет также всегда заканчиваться ==.

3
ответ дан 7 November 2019 в 04:42

Необходимо считать приблизительно в 8 раз больше байтов, чем желаемое количество букв и цифры, затем удалить те байты, которые не кодируют буквы или цифры.

bizzare квадратные символы с кодами внутри появляются, потому что Ваша локаль установлена на UTF-8, но Вы читаете произвольные байты от /dev/urandom, которые (конечно), не уважают правила кодировки UTF-8.

я не делаю Python (но вижу редактирование в конце этого ответа для возможно ужасного кода Python), но цели очень легко достигнуть с простым сценарием оболочки. Для генерации случайных паролей, содержащих буквы и цифры, можно использовать что-то как:

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

От 512 байтов можно извлечь в среднем 124 буквы и цифры. (Существуют 62 = 2 * 26 + 10 букв и цифры в 256 различных байтах, которые сгенерированы с той же вероятностью.)

можно хотеть измениться a-zA-Z0-9 для удаления символов, которые выглядят слишком много подобными. Можно также хотеть измениться 16, если Вы хотите дольше или более короткие пароли.

, Например, генерируйте 20 символьного устранения пароля символы, которые могут быть перепутаны (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

(Это - расшифровка стенограммы, $ и >, приглашения оболочки.)

Редактирование: Это - результат моих скромных навыков Python:

#! /usr/bin/env python
import os
import re
print(re.sub("[^a-zA-Z0-9]", "", os.urandom(256))[:6])
0
ответ дан 7 November 2019 в 04:42

Другие вопросы по тегам:

Похожие вопросы: