从stdin读取密码

Bol*_*wyn 178 python passwords interactive prompt

场景:交互式CLI Python程序,需要密码.这也意味着,没有可能的GUI解决方案.

在bash中,我可以在不通过屏幕重新提示的情况下读取密码

read -s
Run Code Online (Sandbox Code Playgroud)

Python有类似的东西吗?也就是说,

password = raw_input('Password: ', dont_print_statement_back_to_screen)
Run Code Online (Sandbox Code Playgroud)

替代方法:在将类型字符发送回屏幕(又称浏览器样式)之前,将其替换为"*".

mjv*_*mjv 276

>>> import getpass
>>> pw = getpass.getpass()
Run Code Online (Sandbox Code Playgroud)

  • 是的,他们的电池.;-) Python的一个很酷的东西是它能够轻松地与其他语言的二进制文件绑定,特别是C,因此利用了很多现有的东西(比如getpass(),我相信) (3认同)
  • 更好的是,getpass()处理CLI工具通过STDIN提供数据的情况,但您希望自己能够输入密码.很棒的工具! (2认同)
  • @Tiemen,但我来这里是为了寻找解决方案,因为即使我将密码通过管道传输到我的脚本, getpass() 仍在提示我并等待密码 (2认同)
  • 但这不会将“*”显示为一种类型。如何实现这一目标? (2认同)

Ste*_*202 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
Run Code Online (Sandbox Code Playgroud)

(这是Python 3.x; raw_input而不是input在使用Python 2.x时使用.)