Читать пароль от stdin


180

Сценарий: интерактивная программа CLI Python, для которой требуется пароль. Это также означает, что GUI-решение невозможно.

В bash я мог прочитать пароль без повторной подсказки на экране через

read -s

Есть ли что-то подобное для Python? То есть,

password = raw_input('Password: ', dont_print_statement_back_to_screen)

Альтернатива: замените напечатанные символы на «*» перед отправкой их обратно на экран (в стиле браузера).

Ответы:


280
>>> import getpass
>>> pw = getpass.getpass()

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

2
Более того, getpass () имеет дело с ситуацией, когда инструмент CLI передает данные через STDIN, и все же вы хотите иметь возможность самостоятельно вводить пароль. Отличный инструмент!
Tiemen

2
@Tiemen, но я пришел сюда в поисках решения, чтобы сделать это, потому что getpass () все еще запрашивает меня и ждет пароля, даже несмотря на то, что я передал пароль к своему сценарию
Майкл

1
Для меня getpass выскочил в окно (не то, что я хотел, ни то, что сказала его помощь) и не скрыло пароль, когда я его набрал! Код для воспроизведения: импорт getpass; getpass.getpass ()
Майкл Грейзбрук

1
но это не отображает '*' как один из типов. Как этого добиться?
Джейсон

53

Да getpass: «Запрашивать у пользователя пароль без повторения».

Изменить: я еще не играл с этим модулем, так что это то, что я только что приготовил (не удивлюсь, если вы найдете подобный код повсюду):

import getpass

def login():
    user = input("Username [%s]: " % getpass.getuser())
    if not user:
        user = getpass.getuser()

    pprompt = lambda: (getpass.getpass(), getpass.getpass('Retype password: '))

    p1, p2 = pprompt()
    while p1 != p2:
        print('Passwords do not match. Try again')
        p1, p2 = pprompt()

    return user, p1

(Это Python 3.x; используйте raw_inputвместо того, чтобы inputиспользовать Python 2.x.)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.