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

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

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


当前回答

更新@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。

其他回答

用getpass getpass ():

from getpass import getpass
password = getpass()

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

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

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

import sys
import msvcrt

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

print '\n'+passwor

您还可以使用pwinput模块,它在Windows和Linux上都可以工作。 它将字符替换为'*'(默认情况下),退格也有效。

import pwinput

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

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

import pwinput

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

有关更多信息,请参阅pwinput文档。

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

特点:

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

缺点:

仅适用于Windows

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

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