从标准输入读取密码

Posted

技术标签:

【中文标题】从标准输入读取密码【英文标题】:Read password from stdin 【发布时间】:2010-12-18 05:15:02 【问题描述】:

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

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

read -s

Python 有类似的东西吗?即,

password = raw_input('Password: ', dont_print_statement_back_to_screen)

替代方法:在将键入的字符发送回屏幕之前将其替换为“*”(也称为浏览器样式)。

【问题讨论】:

【参考方案1】:

是的,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。)

【讨论】:

【参考方案2】:
>>> import getpass
>>> pw = getpass.getpass()

【讨论】:

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

以上是关于从标准输入读取密码的主要内容,如果未能解决你的问题,请参考以下文章

通过标准输入安全地将密码传递给 openssl

从标准输入读取整数

确定子进程是不是从标准输入读取

go:读取标准输入

go:读取标准输入

从标准输入读取所有文本到字符串