你知道在Linux中,当你尝试进行某些Sudo操作时,它会要求你输入密码,但是在你输入时终端窗口不会显示任何内容(密码不会显示)吗?
在Python中是否有一种方法可以做到这一点?我正在编写一个需要敏感信息的脚本,并希望在输入时隐藏它。
换句话说,我想从用户那里获取密码而不显示密码。
在Python中是否有一种方法可以做到这一点?我正在编写一个需要敏感信息的脚本,并希望在输入时隐藏它。
换句话说,我想从用户那里获取密码而不显示密码。
from getpass import getpass
password = getpass()
可以通过参数传递一个可选的提示;默认值为"Password: "
。
请注意,此函数需要一个适当的终端,以便它可以关闭已键入字符的回显 - 有关详细信息,请参见从IDLE运行时“GetPassWarning:无法控制终端上的回声”。
getpass()
的想法是为了防止任何人通过查看源代码来发现您的密码,并且当您输入密码时,没有人可以通过盯着屏幕读取密码来获取您的密码。 - ArtOfWarfaregetpass
函数。当在不兼容的终端上运行时,它会显示密码,而文档并没有说明如何事先检查这一点(例如尝试其他方法来获取密码)或者直接失败而不是要求输入密码并回显到终端上。 - callegarimport getpass
pswd = getpass.getpass('Password:')
getpass 可在 Linux、Windows 和 Mac 上使用。
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.
,但在命令提示符中运行良好,找到了原因在这里。 - Oshadaimport sys
):getpass.getpass(
<string>,sys.stderr)
。 - Philip Kearnsfrom easygui import passwordbox
,然后跟着password = passwordbox("Enter password:")
。 - user697473这段代码将会在每个字母的位置打印出一个星号。
import sys
import msvcrt
passwor = ''
while True:
x = msvcrt.getch()
if x == '\r':
break
sys.stdout.write('*')
passwor +=x
print '\n'+passwor
getpass
的答案。 - Jean-François Fabre更新@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。
您还可以使用pwinput模块,它适用于Windows和Linux。默认情况下,它将字符替换为“*”,并且退格键可用。
import pwinput
password = pwinput.pwinput(prompt='Password: ')
您可以选择传递不同的掩码
字符。
import pwinput
password = pwinput.pwinput(prompt='Password: ', mask='')
请查看pwinput文档以获取更多信息。
*
字符(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
*
或其他符号,请参见 https://dev59.com/b1sV5IYBdhLWcg3wwxSX(但这里的一些答案也涵盖了该情况)。 - Karl Knechtel