在Python中获取命令行密码输入


234

您知道在Linux中尝试一些Sudo东西时如何告诉您输入密码,并且在键入时,终端窗口中什么都没有显示(密码未显示)?

有没有办法在Python中做到这一点?我正在编写一个脚本,该脚本需要非常敏感的信息,并希望在键入时将其隐藏。

换句话说,我想从用户那里获取密码而不显示密码。

Answers:


298

使用getpass.getpass()

from getpass import getpass
password = getpass()

可以将可选提示作为参数传递;默认值为"Password: "

请注意,此功能需要正确的终端,因此它可以关闭键入字符的回显– 有关更多详细信息,请从IDLE运行时,请参见“ GetPassWarning:无法控制终端上的回显”


可以正常工作,但是如何防止一个“黑客”复制该脚本,然后注释掉需要用户密码的行呢?
asf107 2012年

129
@ asf107:如果黑客可以编辑源代码,则还有其他问题需要担心。
DSM

12
@ asf107-要求输入密码的想法是,您可以将其传递给进行某种身份验证(即,IE,我正在使用它来请求用于通过在线服务器进行认证的密码)。如果黑客注释掉了该行,则该程序将仅会失败,因为服务器将不再通过身份验证。背后采用的想法getpass()是这样,没有人可以看看源代码,并通过阅读它找出你的密码,没有人可以只盯着你的肩膀和阅读您的密码,关闭屏幕,当你键入它获取您的密码。
ArtOfWarfare 2014年

158
import getpass

pswd = getpass.getpass('Password:')

getpass可在Linux,Windows和Mac上使用。


11
默认提示是“ Password:”(冒号后面有空格),因此通常不需要在对getpass.getpass()的调用中指定它。
JL

getpass是一个标准库模块,至少从Python 2.5开始就存在
-jocassid

1
这给了我一个Warning (from warnings module): File "C:\Python27\lib\getpass.py", line 92 return fallback_getpass(prompt, stream) GetPassWarning: Can not control echo on the terminal. Warning: Password input may be echoed. IDLE 错误,但在命令提示符下运行良好,在这里
Oshada

getpass()不适用于IDLE。没有getpass(),还有另一种方法可以实现此目的吗?
布伦丹

要在stderr上显示提示(您还需要import sys):getpass.getpass(<string>,sys.stderr)
Philip Kearns,


12

此代码将打印一个星号,而不是每个字母。

import sys
import msvcrt

passwor = ''
while True:
    x = msvcrt.getch()
    if x == '\r':
        break
    sys.stdout.write('*')
    passwor +=x

print '\n'+passwor

7
这仅是Windows,但至少没有重复getpass答案。好
让·弗朗索瓦·法布尔

3
不会处理退格键。
Aykut Kllic

我不确定您的代码是否适用于Python 2.x,但这对我不起作用。我正在运行Python3.x。我遇到的第一个错误是“密码+ = x”行的TypeError。它说:“不能将字节对象隐式转换为str”。我更改了行,以便将x显式转换为字符串,例如:“ password + = str(x)”。但是代码仍然不起作用。当我运行它时,它不会提示我输入,它只会永远打印星号。
拉珀

@Larper适用于Python 2,请参见代码的最后一行
MilkyWay90


0

更新@Ahmed ALaa的答案

# import msvcrt
import getch

def getPass():
    passwor = ''
    while True:
        x = getch.getch()
        # x = msvcrt.getch().decode("utf-8")
        if x == '\r' or x == '\n':
            break
        print('*', end='', flush=True)
        passwor +=x
    return passwor

print("\nout=", getPass())

msvcrt仅适用于Windows,但从PyPI获取getch应该对两者都适用(我仅在linux上进行过测试)。您也可以注释/取消注释这两行,以使其适用于Windows。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.