正如通常的情况一样,有一个 Python 模块已经解决了我的问题。这个模块是 getpass4,从用户的角度来看,它的行为和 input 完全一样,只是不显示用户输入的内容。
你可以用 pip 安装这两个模块:
$ python -m pip install --user python-gnupg getpass4
下面是我的 Python 脚本,用于创建密码提示:
#!/usr/bin/env python
# by Seth Kenlon
# GPLv3
# install deps:
# python3 -m pip install --user python-gnupg getpass4
import gnupg
import getpass
from pathlib import Path
def get_api_pass():
homedir = str(Path.home())
gpg = gnupg.GPG(gnupghome=os.path.join(homedir,".gnupg"), use_agent=True)
passwd = getpass.getpass(prompt="Enter your GnuPG password: ", stream=None)
with open(os.path.join(homedir,'.mutt','pass.gpg'), 'rb') as f:
apipass = (gpg.decrypt_file(f, passphrase=passwd))
f.close()
return str(apipass)
if __name__ == "__main__":
apipass = get_api_pass()
print(apipass)
如果你想试试,把文件保存为 password_prompt.py。如果你使用 offlineimap 并想在你自己的密码输入中使用这个方案,那么把它保存到某个你可以在 .offlineimaprc 文件中指向 offlineimap 的位置(我使用 ~/.mutt/password_prompt.py)。
测试密码提示
要查看脚本的运行情况,你首先必须创建一个加密文件(我假设你已经设置了 GPG):
$ echo "hello world" > pass
$ gpg --encrypt pass
$ mv pass.gpg ~/.mutt/pass.gpg
$ rm pass
现在运行 Python 脚本:
$ python ~/.mutt/password_prompt.py
Enter your GPG password:
hello world
当你输入时没有任何显示,但只要你正确输入 GPG 口令,你就会看到该测试信息。
将密码提示符与 offlineimap 整合起来
我需要将我的新提示与 offlineimap 命令结合起来。我为这个脚本选择了 Python,因为我知道 offlineimap 可以对 Python 程序进行调用。如果你是一个 offlineimap 用户,你会明白唯一需要的“整合”是在你的 .offlineimaprc 文件中改变两行。
首先,添加一行引用 Python 文件的内容:
pythonfile = ~/.mutt/password_prompt.py
然后将 .offlineimaprc中的 remotepasseval 行改为调用 password_prompt.py中的 get_api_pass() 函数:
remotepasseval = get_api_pass()
配置文件中不再有密码!
安全问题
在你的个人电脑上考虑安全问题有时会让人觉得很偏执。你的 SSH 配置是否真的需要限制为 600?隐藏在名为 .mutt 的无关紧要的电子邮件密码真的重要吗?也许不重要。
然而,知道我没有把敏感数据悄悄地藏在我的配置文件里,使我更容易把文件提交到公共 Git 仓库,把片段复制和粘贴到支持论坛,并以真实好用的配置文件的形式分享我的知识。仅就这一点而言,安全性的提高使我的生活更加轻松。而且有这么多好的 Python 模块可以提供帮助,这很容易实现。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。