从标准输入读取密码

188

场景:一个需要密码的交互式CLI Python程序,也就是说,没有GUI解决方案可用。

在bash中,我可以通过以下方式获取密码并在屏幕上不重复提示:

read -s

有没有 Python 的类似功能呢?即,

password = raw_input('Password: ', dont_print_statement_back_to_screen)

替代方案:在将字符返回到屏幕(即浏览器样式)之前,用“*”替换已输入的字符。

2个回答

297
>>> import getpass
>>> pw = getpass.getpass()

4
是的,那些电池。;-) Python 的一个很酷的特点是它能够轻松地与其他语言中的二进制文件绑定,特别是 C 语言,因此可以利用许多现有的东西(例如 getpass(),我相信)。 - mjv
2
更好的是,getpass() 处理了通过 STDIN 提供数据给 CLI 工具的情况,同时你还想自己输入密码的能力。非常棒的工具! - Tiemen
2
@Tiemen 但我来这里是为了寻找解决方案,因为即使我将密码传输到我的脚本中,getpass()仍然提示我并等待密码。 - Michael
1
对我来说,getpass弹出了一个窗口(不是我想要的,也不是它的帮助所说的),并且在我输入密码时没有遮挡密码!重现代码:import getpass; getpass.getpass() - Michael Grazebrook
2
但是在输入的时候,它不会显示“*”。怎样才能做到这一点? - Jason
显示剩余2条评论

55

是的,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版;在使用Python 2.x时,请使用raw_input而不是input。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接