Прочитайте пароль від 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, і все ж ви хочете можливість самостійно вводити пароль. Чудовий інструмент!
Тімен

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

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.