Я написал короткий скрипт на 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=
Генерировать случайную алфавитно-цифровую строку с помощью 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
вывод будет также всегда заканчиваться ==
.
Необходимо считать приблизительно в 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])