如何在Python控制台程序中使用echo“*”读取密码?

时间:2011-10-20 15:42:35

标签: python windows

我正在Windows下用Python编写一个控制台程序 用户需要登录才能使用该程序,当他输入密码时,我希望它们被回显为“*”,而我可以得到用户输入的内容。
我在标准库中找到了一个名为getpass的模块,但是当你输入(linux like)时它不会回显任何东西 感谢。

3 个答案:

答案 0 :(得分:8)

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方式更好;即使只知道密码中的字符数对于想要破解它的人来说也是一个重要的暗示。

答案 1 :(得分:5)

kindall的答案很接近,但它有退格而不是删除星号的问题,以及退格能够超出输入提示。

尝试:

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。

答案 2 :(得分:0)

You can use the getpass module.这并不完全回答这个问题,因为除了提示之外,getpass函数不向控制台输出任何内容。这样做的原因是它是一个额外的安全层。如果有人在监视你的肩膀,他们将无法确定你的密码有多长。

以下是如何使用它的示例:

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

此示例将显示“输入您的密码:”,然后您可以输入密码。