我试图弄清楚如何提示输入密码,并将用户输入回显为星号(********
)
最近,我开始创建一个可以连接到使用Python中的套接字模块的远程服务器的项目。它还没有完成,因为我正在使控制台用于连接服务器。
我正在尝试创建一个登录窗口,提示用户输入用户名和密码,但输入密码时我正在寻找要打印的星号,就像常见的密码输入一样(即 - Sekr3t被回复为:* * * * * *)。
经过几天的研究,我差不多完成了但是还有最后一个错误让我疯了(我完全无法解决它)。注意 - 我知道有一个getpass模块可以用来替换它,更容易,但没有回声不是我正在寻找的。 p>
这是我到目前为止的密码登录代码,我无法弄清楚为什么它不会回响星号:
import msvcrt
import sys
def login(prompt = '> '):
write = sys.stdout.write
for x in prompt:
msvcrt.putch(x)
passw = ""
while 1:
x = msvcrt.getch()
if x == '\r' or x == '\n':
break
if x == '\b':
# position of my error
passw = passw[:-1]
else:
write('*')
passw = passw + x
msvcrt.putch('\r')
msvcrt.putch('\n')
return passw
>
如果您仔细阅读代码和/或通过IDLE之类的内容进行操作,您可能会注意到,当用户退格时,存储的数据会被一个字符删除,但打印的星号则不会。 ie - Sekr3t + backspace = Sekr3,但是* * * * * *留下了回音。任何关于如何在输入退格时擦除最后一个星号的帮助将不胜感激。还要注意,很多代码来自getpass模块。我知道这不是一个很好的解释,可能不是那么好的代码,但我还在学习 - 请耐心等待。
答案 0 :(得分:3)
您应该可以通过编写字符\x08 \x08
来删除星号。 \x08
将光标向后移动一个位置,空格将覆盖星号,然后最后\x08
将光标移回原位,将其置于正确的位置以写入下一个{{1} }。
我不知道如何确定何时输入退格键,但您可以轻松地执行此操作:只需在调用*
后添加print repr(x)
之类的内容,然后启动你的程序并点击退格。
答案 1 :(得分:0)
我认为这种方式非常简单有效
import sys
import msvcrt
passwor = ''
while True:
x = msvcrt.getch()
if x == '\r':
break
sys.stdout.write('*')
passwor +=x
print '\n'+passwor
答案 2 :(得分:0)
我多年前做过这一切......在壳牌......
关于进一步改进它的想法...... https://antofthy.gitlab.io/info/crypto/passwd_askpass_stars.txt
最终剧本有很多花里胡哨而且还在不断发展 https://antofthy.gitlab.io/software/#askpass_stars
请注意,您真的不应该将它直接包含在您的程序中,而应将其设置为密码助手,以便许多程序可以使用它。 EG:使用环境变量(如 TTY_ASKPASS)或其他配置设置程序。
见https://stackoverflow.com/a/67327327/701532
通过这样做,您不会将用户限制为您提供的内容,而是允许从其他地方获取密码。 “ssh”甚至“sudo”也这样做。