Прочитать пароль со стандартного ввода

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

В bash я мог прочитать пароль, не запрашивая его повторно на экране через

read -s

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

password = raw_input('Password: ', dont_print_statement_back_to_screen)

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


person Boldewyn    schedule 19.11.2009    source источник


Ответы (2)


Да, 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 вместо _ 4_ при использовании Python 2.x.)

person Stephan202    schedule 19.11.2009

person    schedule
comment
Ага, батарейки. ;-) Одна из замечательных особенностей Python - это его способность легко связываться с двоичными файлами на другом языке, в частности C, следовательно, используя множество существующих вещей (таких как getpass (), я считаю) - person mjv; 19.11.2009
comment
Более того, getpass () имеет дело с ситуацией, когда инструмент CLI получает данные через STDIN, а вам нужна возможность самостоятельно вводить пароль. Отличный инструмент! - person Tiemen; 23.07.2013
comment
@Tiemen, но я пришел сюда в поисках решения, потому что getpass () все еще запрашивает меня и ждет пароль, хотя я отправил пароль в свой скрипт - person Michael; 22.12.2013
comment
Для меня команда getpass открывала всплывающее окно (не то, что я хотел и не то, что говорила его помощь) и не скрывала пароль, когда я его набирал! Код для воспроизведения: import getpass; getpass.getpass () - person Michael Grazebrook; 16.09.2014
comment
@Tiemen IIRC, инструменты unix поддерживают это, повторно открывая поток stderr для чтения, а не для записи. Отличный прием, да? - person jpaugh; 17.09.2016
comment
но это не отображает '*' как один. Как этого добиться? - person Jason; 17.11.2017