Tam*_*him 20 encryption gpg offlineimap
我正在尝试设置 OfflineIMAP 以通过 gpg 加密文件进行身份验证(这样我可以将所有加密合并到我的 gpg-agent 进程中)。
从文档来看,加密服务器密码的唯一方法似乎是使用 gnome-keyring(我不想在我的无头服务器上运行)。有没有办法像使用 mutt 一样从 gpg 文件中输入我的密码?
我知道您可以使用扩展名 python 文件向 offlineimap 添加额外功能,但恐怕我不知道从哪里开始。
kbe*_*eta 30
我使用以下方法,效果很好:
1) 将您的密码存储在单独的 gpg 加密文件中。例如~/.passwd/<accountname>.gpg
2) 使用您选择的名称(例如 )创建一个 python 扩展文件,~/.offlineimap.py
内容如下:
def mailpasswd(acct):
acct = os.path.basename(acct)
path = "/home/<username>/.passwd/%s.gpg" % acct
args = ["gpg", "--use-agent", "--quiet", "--batch", "-d", path]
try:
return subprocess.check_output(args).strip()
except subprocess.CalledProcessError:
return ""
Run Code Online (Sandbox Code Playgroud)
3) 修改您的 .offlineimaprc 文件以告诉它有关 python 文件的信息,并告诉它如何读取您的密码
[general]
pythonfile = ~/.offlineimap.py
# ...
[Repository <reponame>]
# add this line for each remote repository
remotepasseval = mailpasswd("<accountname>")
Run Code Online (Sandbox Code Playgroud)
如果您有多个帐户同时被检查(单独的线程),并且您使用 gpg-agent,那么它会要求您为每个帐户提供密码。我通过创建文件 ( echo "prime" | gpg -e -r foo@bar.com > ~/.passwd/prime.gpg
) 来启动代理,并通过在启动 offlineimap 时解密此文件来启动 gpg 代理。为此,请将以下内容添加到 末尾~/.offlineimap.py
:
def prime_gpg_agent():
ret = False
i = 1
while not ret:
ret = (mailpasswd("prime") == "prime")
if i > 2:
from offlineimap.ui import getglobalui
sys.stderr.write("Error reading in passwords. Terminating.\n")
getglobalui().terminate()
i += 1
return ret
prime_gpg_agent()
Run Code Online (Sandbox Code Playgroud)
另一种在知道密码的情况下让 offlineimap 运行但不将密码放在磁盘上的方法是让 offlineimap 在 tmux/screen 中运行,并autorefresh
在您的设置中启用~/.offlineimaprc
您需要添加autorefresh = 10
到[Account X]
offlineimaprc 文件的部分,以使其每 10 分钟检查一次。同时删除任何带有password
或 的配置行passwordeval
。
然后运行 offlineimap - 它会询问您的密码并将其缓存在内存中。第一次运行后不会退出,但会休眠10分钟。然后它会唤醒并再次运行,但它仍会记住您的密码。
因此,您可以使用 offlineimap 运行 tmux 会话,输入一次密码,然后 offlineimap 就可以了。
喜欢@kbeta 的回答。但是subprocess.check_output()
仅在 python 2.7 中引入 - 所以这里是一个offlineimap.py
适用于旧版本 python 的版本:
import os
import subprocess
def mailpasswd(acct):
acct = os.path.basename(acct)
path = "/home/hamish/.passwd/%s.gpg" % acct
args = ["gpg", "--use-agent", "--quiet", "--batch", "-d", path]
proc = subprocess.Popen(args, stdout=subprocess.PIPE)
output = proc.communicate()[0].strip()
retcode = proc.wait()
if retcode == 0:
return output
else:
return ''
Run Code Online (Sandbox Code Playgroud)