你知道在Linux中,当你尝试一些Sudo的东西时,它会告诉你输入密码,当你输入时,终端窗口中什么也没有显示(密码没有显示)?
在Python中有办法做到这一点吗?我正在编写一个脚本,需要如此敏感的信息,并希望在我输入它时将其隐藏起来。
换句话说,我希望在不显示密码的情况下从用户那里获取密码。
你知道在Linux中,当你尝试一些Sudo的东西时,它会告诉你输入密码,当你输入时,终端窗口中什么也没有显示(密码没有显示)?
在Python中有办法做到这一点吗?我正在编写一个脚本,需要如此敏感的信息,并希望在我输入它时将其隐藏起来。
换句话说,我希望在不显示密码的情况下从用户那里获取密码。
当前回答
更新@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。
其他回答
用getpass getpass ():
from getpass import getpass
password = getpass()
可选的提示符可以作为参数传递;默认为Password:。
注意,这个函数需要一个合适的终端,所以它可以关闭输入字符的回显——当从IDLE运行时,查看“GetPassWarning: can not control echo on terminal”了解更多细节。
这段代码将打印一个星号,而不是每个字母。
import sys
import msvcrt
passwor = ''
while True:
x = msvcrt.getch()
if x == '\r':
break
sys.stdout.write('*')
passwor +=x
print '\n'+passwor
您还可以使用pwinput模块,它在Windows和Linux上都可以工作。 它将字符替换为'*'(默认情况下),退格也有效。
import pwinput
password = pwinput.pwinput(prompt='Password: ')
你也可以选择传递一个不同的掩码字符。
import pwinput
password = pwinput.pwinput(prompt='Password: ', mask='')
有关更多信息,请参阅pwinput文档。
更新@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。
这是我的代码基于@Ahmed ALaa提供的代码
特点:
适用于64个字符以内的密码 接受退格输入 输出*字符(DEC: 42;HEX: 0x2A)而不是输入字符
缺点:
仅适用于Windows
函数secure_password_input()在调用时将密码作为字符串返回。它接受一个Password Prompt字符串,该字符串将显示给用户以输入密码
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