Как прочитать пароль с помощью echo "*" в консольной программе Python? - PullRequest
9 голосов
/ 20 октября 2011

Я пишу консольную программу с Python под Windows.
Пользователь должен войти в систему, чтобы использовать программу, когда он вводит свой пароль, я бы хотел, чтобы они отображались как "*", а я могуполучить то, что вводил пользователь.
Я нашел в стандартной библиотеке модуль, называемый getpass, но он ничего не отобразит при вводе (как в linux).
Спасибо.

Ответы [ 3 ]

8 голосов
/ 20 октября 2011

Модуль getpass написан на Python. Вы можете легко изменить это, чтобы сделать это. Фактически, вот модифицированная версия getpass.win_getpass(), которую вы можете просто вставить в свой код:

import sys

def win_getpass(prompt='Password: ', stream=None):
    """Prompt for password with echo off, using Windows getch()."""
    import msvcrt
    for c in prompt:
        msvcrt.putch(c)
    pw = ""
    while 1:
        c = msvcrt.getch()
        if c == '\r' or c == '\n':
            break
        if c == '\003':
            raise KeyboardInterrupt
        if c == '\b':
            pw = pw[:-1]
            msvcrt.putch('\b')
        else:
            pw = pw + c
            msvcrt.putch("*")
    msvcrt.putch('\r')
    msvcrt.putch('\n')
    return pw

Вы можете пересмотреть это, однако. Путь Linux лучше; даже просто зная количество символов в пароле, это важный совет для того, кто хочет его взломать.

5 голосов
/ 21 мая 2013

Ответ kindall близок, но у него есть проблемы с тем, что backspace не стирает звездочки, а также не позволяет backspace вернуться за пределы ввода.

Попытка:

def win_getpass(prompt='Password: ', stream=None):
    """Prompt for password with echo off, using Windows getch()."""
    if sys.stdin is not sys.__stdin__:
        return fallback_getpass(prompt, stream)
    import msvcrt
    for c in prompt:
        msvcrt.putwch(c)
    pw = ""
    while 1:
        c = msvcrt.getwch()
        if c == '\r' or c == '\n':
            break
        if c == '\003':
            raise KeyboardInterrupt
        if c == '\b':
            if pw == '':
                pass
            else:
                pw = pw[:-1]
                msvcrt.putwch('\b')
                msvcrt.putwch(" ")
                msvcrt.putwch('\b')
        else:
            pw = pw + c
            msvcrt.putwch("*")
    msvcrt.putwch('\r')
    msvcrt.putwch('\n')
    return pw

Обратите внимание, что mscvrt.putwch не работает с python 2.x, вместо этого вам нужно использовать mscvrt.putch.

0 голосов
/ 20 октября 2011

Вы можете использовать модуль getpass. Это не совсем отвечает на вопрос, потому что функция getpass не выводит на консоль ничего, кроме приглашения. Причина этого в том, что это дополнительный уровень безопасности. Если кто-то смотрит через ваше плечо, он не сможет выяснить, как долго ваш пароль.

Вот пример того, как его использовать:

from getpass import getpass
getpass('Enter your password: ')

В этом примере будет отображаться «Введите ваш пароль:», а затем вы сможете ввести свой пароль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...