如何有密码回荡为星号如何有密码回荡为星号(How to have password echoed a

2019-05-17 15:52发布

我试图找出如何提示输入密码,并让用户输入回显星号( ********

所以最近,我承担了创建可以连接到使用在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,你可能会注意到,当用户回到空间的,存储的数据是由一个字符删除,但打印的星号都没有。 即 - Sekr3t + Backspace键= Sekr3,但* * * * * *是左回显。 如何擦除时退格enter'd最后一个星号的任何帮助,将不胜感激。 另外要注意,很多这样的代码来自getpass模块。 我知道这是不是很大的解释,而且可能不是很大的代码,但我仍然在学习 - 请多多包涵。

Answer 1:

您应该能够通过写字符删除星号\x08 \x08 。 该\x08将光标移动回一个位置,空间将覆盖星号,那么最后的\x08将再次移动光标,将它放在正确的位置写入下一个*

我不知道把我的头如何确定何时退格键键入的顶部,但你可以做到这一点很容易:只需添加类似print repr(x)你叫后, x = msvcrt.getch()然后启动程序并点击退格。



Answer 2:

我觉得这个方法是非常简单而有效

import sys
import msvcrt

passwor = ''
while True:
    x = msvcrt.getch()
    if x == '\r':
        break
    sys.stdout.write('*')
    passwor +=x

print '\n'+passwor


文章来源: How to have password echoed as asterisks