Pythongetpass 模块提供了可移植的密码输入功能,并允许你在命令行界面(CLI)中接受一个输入字符串,而输入的字符串在界面中不可见(回声)。
getpass 模块还包括一个getuser 函数,用于从相关的环境变量中检索一个用户名。
在这个getpass Python 教程中,我将告诉你如何安装getpass 并使用该功能,然后解释一些背景概念和常见问题。
如何安装 Python Getpass?
getpass 模块是 Python 标准库的一部分,归入*"通用操作系统服务 "*类别。
这意味着你很可能在你的Python 安装中已经有了它,不需要再安装它。然而,它不是一个内置的函数,所以你需要导入它来使用它。
像这样:
import getpass
语法和例子
下面是说明如何使用 Pythongetpass 模块的语法和例子。
getpass.getpass(prompt='Password: ', stream='None')
prompt 是一个可选的关键字参数,用于用户在命令行界面中看到的提示其密码输入的内容。默认值是'Password: ' ,如果你不提供其他提示,就会显示出来。
stream 关键字参数是让你指定提示信息写入的流(只在Unix上使用)。如果你没有指定一个替代流,默认值为None ,getpass() 函数将为你选择最合适的流。
例子
import getpass
users = {
'nick': '12345'
}
usr = input('Username: ')
if usr in users:
passwrd = getpass.getpass('Enter Password: ')
if passwrd == users[usr]:
print('Access approved')
else:
print('Incorrect password, access denied')
else:
print(f'User not found: {usr}')
输出
代码提示用户在两个不同的点输入数值 'Username: ' 和 'Enter Password' ,代码的输出将根据输入的不同而不同
Username Entered / Password Entered : Output
nick / 1234 : Access approved
nick / [anything other than ‘1234’] : Incorrect password, access denied
[anything other than ‘nick’] / n/a : User not found: {[user entered]}
解释一下
在这个例子中,我们先用一个字典记录用户名和相应的密码。
注意。密码不应该以明文形式存储在这样的数据库中,但这只是一个快速说明性的例子)。
首先,我们使用标准输入询问一个用户名(我将在下面讨论一个替代方法),然后如果在字典中找到用户名,我们使用getpass() 函数询问相应的密码。
注意:我们使用了可选的 参数来输入我们的自定义密码提示prompt Enter Password:
然后程序检查输入的密码是否与字典中记录的用户对应的密码相符。
如果密码与用户名相符,则打印出一条成功信息,但如果密码不正确,则打印出一条失败信息。
使用案例
getpass 模块只是用于在CLI(命令行界面)中接受一个字符串,而不需要在输入时将该字符串回声到CLI中。
这可以作为任何CLI应用程序的基本安全第一步。这不是一个完整的安全解决方案,所以如果你需要保护敏感数据,你应该实施进一步的安全层。
该模块是为接受密码而设计的,但你可以用它来接受任何你想隐藏的字符串,如测验的秘密答案。
GetPassWarning
如果由于某些原因,getpass() 函数不能阻止 CLI 回显密码,GetPassWarning 将被触发以警告用户。
这将看起来像这样
GetPassWarning: Can not control echo on the terminal.
passwd = fallback_getpass(prompt, stream)
Warning: Password input may be echoed.
函数getuser()
getuser() 函数是getpass 模块中的第二个可用函数。它被用来从四个现有的环境变量中的一个获得一个用户名。
LOGNAMEUSERLNAMEUSERNAME
如果这些环境变量中没有包含用户名字符串,该函数将尝试从'Password Database' pwd 模块中获取用户名。
下面是一个关于getuser() 的例子。
# USER environment variable already set by the os
# os.environ['USER'] = 'nick'
import getpass
users = {
'nick': '12345'
}
usr = getpass.getuser()
if usr in users:
print(f'Welcome back, {usr}')
输出
Welcome back, nick
解释
在这个代码示例中,getuser() 函数试图提取一个用户名,然后我们检查该用户名是否在我们的dict中。如果是的话,我们就打印消息 'Welcome back, [username]'
FAQ Getpass
这就是对getpass 模块的解释。在文章的其余部分,我将介绍一些相关的FAQ和背景信息。
什么是 Python Getpass 中的流?
计算中的流是可以在两个端点之间传输数据的东西;一个源和一个流,或者说是 'input' 和 'output.
三个标准的输入/输出(I/O)流是:stdin (标准输入)、stdout (标准输出)和stderr (标准错误)。
最初这些是物理连接,但在现代计算和软件中,它们被抽象化了。
流就像文件一样,你可以从流中读/写数据,就像你可以用文件一样。它们与getpass 有关,因为如果默认的流不可用,该模块将尝试使用替代的流来读写数据。
根据 getpass docs。
在Unix上,如果需要的话,提示信息将被写入类似文件的对象流,使用替换的错误处理程序。流默认为控制终端(/dev/tty),如果不可用,则为sys.stderr(这个参数在Windows上被忽略)。
如果echo自由输入不可用,getpass() ,就会退回到向stream打印一个警告信息,并从sys.stdin读取,然后发出一个GetPassWarning.
Python中的tty是什么?
最初, **tty**是一个物理 "电传打字机 "设备的简称,它将打字机与电传带打印机连接起来。
现在,**tty**被用来描述任何文本输入/输出环境,可以是物理的,也可以是软件的,大致相当于术语''。终端.'
A '控制台'是终端的物理版本。
A '终端仿真器是物理终端的一个软件版本。这可能是你习惯于在你的计算机上工作的东西。
A '外壳是一个在终端上运行的命令行解释器。
这可以帮助消除这些术语的歧义,但要注意的是,它们经常被互换使用。
什么是 Python 中的 getpass?
Getpass 是一个掩盖密码输入的模块,这样它就不会在输入时被回声到命令行界面。该模块还提供了对提示密码输入和检索当前用户的用户名的支持。
Getpass 是否在 Python 标准库中?
是的,它是。然而,它不是一个内置函数,所以你仍然需要导入它来在你的代码中使用它。像这样。import getpass