你知道如何在Linux中尝试一些Sudo的东西它会告诉你输入密码,当你输入时,终端窗口中没有显示任何内容(密码没有显示)?
有没有办法在Python中做到这一点?我正在编写一个需要如此敏感信息的脚本,并希望在我输入时隐藏它.
换句话说,我想从用户那里获取密码而不显示密码.
我正在尝试使用Tkinter编写登录窗口,但我无法以星号格式隐藏密码文本.这意味着密码输入是纯文本,必须避免.知道怎么做吗?
据我所知,此问题之前已被提出,但仍然缺乏答案.所以我再次提出这个问题,以便最终得到这个问题的答案.(如果我错了,请给我答案的网址.)
问题:程序员希望用户输入密码.在将getpass()函数就是为了这个目的很好,但它的使用有一个缺点:当输入密码没有打印到标准输出.
问题:如何在为用户键入的每个字符打印星号时实现getpass()?(当然,退格 -甚至是POS1和结束 -应采取相应的照顾.)
动机:社区中有人不理解为什么要问这个问题.然后用a)引用getpass(),这样忽略了手头的任务,b)没有考虑那个引用不会回答问题.之所以可能希望打印星号是为了方便用户:他们在密码输入期间获得直接的视觉响应.因此,他们不会因按键而感到困惑,而且 - 在那里 - 似乎没有任何事情发生.
迈向解决方案的一步:
让我在这里向解决方案迈出第一步.请帮忙,以便将其演变成真正的解决方案.
有一个名为getch的模块似乎允许从stdin逐字符读取.Backspace非常奇怪地映射到127的整数值,但是这样的解决方案可能如下所示:
def readLineWithAsterisks():
sBuffer = ''
while True:
c = getch.getch()
if c == '\n':
return sBuffer
elif ord(c) == 127:
if len(sBuffer) > 0:
sys.stdout.write('\x08 \x08')
sys.stdout.flush()
sBuffer = sBuffer[0:-1]
continue
else:
sys.stdout.write('*')
sys.stdout.flush()
sBuffer += c
Run Code Online (Sandbox Code Playgroud)
但是这段代码有一些缺点.首先,我非常困惑c如果进入退格,则不是'\ b' .也许这样有解释?仅处理第二个ASCII字符,至少在Linux上是这样.我在这里不了解Windows,但如果按下A-Z0-9以外的字符,则行c = getch.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
Run Code Online (Sandbox Code Playgroud)
>
如果您通过代码阅读和/或通过IDLE之类的内容运行它,您可能会注意到当用户后退空间时,存储的数据被一个字符擦除,但打印的星号不是.ie - Sekr3t + backspace = Sekr3,但是******留下了回音.任何关于如何在输入退格时擦除最后一个星号的帮助将不胜感激.另请注意,很多此代码来自getpass模块.我知道这不是一个很好的解释,可能不是那么好的代码,但我还在学习 - 请耐心等待.
我试图用星号掩盖用户输入IDLE的内容,这样他们周围的人就无法看到他们输入/输入的内容.我正在使用基本的原始输入来收集他们输入的内容.
key = raw_input('Password :: ')
Run Code Online (Sandbox Code Playgroud)
用户输入密码后理想的IDLE提示:
Password :: **********
Run Code Online (Sandbox Code Playgroud) 如何在python中使用getpass模块输入密码时获得星号?
实际结果:
import getpass
p=getpass.getpass("Enter the Password:")
Enter the Password:
print (p)
Output: password
Run Code Online (Sandbox Code Playgroud)
期待结果:
import getpass
p=getpass.getpass("Enter the Password:")
Enter the Password:********
print (p)
Output: password
Run Code Online (Sandbox Code Playgroud)
Python 版本:2.7
为什么呢?
有时我需要导入模块的所有属性,因此我使用通配符导入,但是我的一个Vim脚本(使用flake8作为其语法检查器)总是向我发出警告,并告诉我无法检测到未定义的名称。
使用通配符导入还有其他缺点吗?