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

180

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

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

read -s

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

password = raw_input('Password: ', dont_print_statement_back_to_screen)

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

Boldewyn
источник

Ответы:

280
>>> import getpass
>>> pw = getpass.getpass()
MJV
источник
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.)

Stephan202
источник