如何将密码回显为星号

时间:2012-06-12 05:32:20

标签: python passwords echo msvcrt getch

我试图弄清楚如何提示输入密码,并将用户输入回显为星号(********

最近,我开始创建一个可以连接到使用Python中的套接字模块的远程服务器的项目。它还没有完成,因为我正在使控制台用于连接服务器。

我正在尝试创建一个登录窗口,提示用户输入用户名和密码,但输入密码时我正在寻找要打印的星号,就像常见的密码输入一样(即 - Sekr3t被回复为:* * * * * *)。

经过几天的研究,我差不多完成了但是还有最后一个错误让我疯了(我完全无法解决它)。注意 - 我知道有一个getpass模块可以用来替换它,更容易,但没有回声不是我正在寻找的。

这是我到目前为止的密码登录代码,我无法弄清楚为什么它不会回响星号:

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模块。我知道这不是一个很好的解释,可能不是那么好的代码,但我还在学习 - 请耐心等待。

3 个答案:

答案 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”也这样做。