您知道在 Linux 中,当您尝试一些 Sudo 操作时,它会告诉您输入密码,而当您键入时,终端窗口中不会显示任何内容(密码不显示)?
有没有办法在Python中做到这一点?我正在编写一个需要如此敏感信息的脚本,并且希望在我键入它时将其隐藏。
换句话说,我想从用户那里获取密码而不显示密码。
getpass.getpass()
:
from getpass import getpass
password = getpass()
可以将可选提示作为参数传递;默认为
"Password: "
。
请注意,此函数需要适当的终端,因此它可以关闭键入字符的回显 - 请参阅 “GetPassWarning:无法控制终端上的回显”,从 IDLE 运行时了解更多详细信息。
import getpass
pswd = getpass.getpass('Password:')
getpass 适用于 Linux、Windows 和 Mac。
此代码将打印一个星号而不是每个字母。
import sys
import msvcrt
passwor = ''
while True:
x = msvcrt.getch()
if x == '\r':
break
sys.stdout.write('*')
passwor +=x
print '\n'+passwor
更新@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。
您还可以使用适用于 Windows 和 Linux 的 pwinput 模块。 它将字符替换为“*”(默认情况下)并且退格键有效。
import pwinput
password = pwinput.pwinput(prompt='Password: ')
您也可以选择传递不同的
mask
字符。
import pwinput
password = pwinput.pwinput(prompt='Password: ', mask='')
请参阅 pwinput 文档了解更多信息。
这是我的代码,基于 @Ahmed ALaa
提供的代码特点:
*
字符 (DEC: 42 ; HEX: 0x2A)
而不是输入字符缺点:
函数
secure_password_input()
在调用时将密码返回为 string
。它接受一个密码提示字符串,该字符串将显示给用户输入密码
def secure_password_input(prompt=''):
p_s = ''
proxy_string = [' '] * 64
while True:
sys.stdout.write('\x0D' + prompt + ''.join(proxy_string))
c = msvcrt.getch()
if c == b'\r':
break
elif c == b'\x08':
p_s = p_s[:-1]
proxy_string[len(p_s)] = " "
else:
proxy_string[len(p_s)] = "*"
p_s += c.decode()
sys.stdout.write('\n')
return p_s