获取隐藏的密码输入

你知道在Linux中,当你尝试一些Sudo的东西时,它会告诉你输入密码,当你输入时,终端窗口中什么也没有显示(密码没有显示)?

在Python中有办法做到这一点吗?我正在编写一个脚本,需要如此敏感的信息,并希望在我输入它时将其隐藏起来。

换句话说,我希望在不显示密码的情况下从用户那里获取密码。

339589 次浏览

使用getpass.getpass():

from getpass import getpass
password = getpass()

可选的提示符可以作为参数传递;默认值是"Password: "

注意,这个函数需要一个合适的终端,所以它可以关闭输入字符的回显——更多细节请参见当从IDLE运行时,“GetPassWarning: Can not control echo on terminal”

import getpass


pswd = getpass.getpass('Password:')

getpass适用于Linux、Windows和Mac。

这段代码将打印一个星号,而不是每个字母。

import sys
import msvcrt


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


print '\n'+passwor

更新@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阿拉提供的代码

特点:

  • 适用于64个字符以内的密码
  • 接受退格输入
  • 输出*字符(DEC: 42 ; HEX: 0x2A)而不是输入字符

缺点:

  • 仅适用于Windows

函数secure_password_input()在被调用时将密码返回为string。它接受一个密码提示字符串,该字符串将显示给用户以输入密码

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
你也可以使用pwinput模块,它在Windows和Linux上都可以工作。 它将字符替换为'*'(默认情况下),退格也有效
import pwinput


password = pwinput.pwinput(prompt='Password: ')

你也可以选择传递一个不同的mask字符。

import pwinput


password = pwinput.pwinput(prompt='Password: ', mask='')

更多信息请参见pwinput文档