我正在编写一个脚本,用于msmtp
通过电子邮件向自己发送定期系统报告。我曾gpg
加密过我的电子邮件密码,并password-eval
在 中使用过msmtp.conf
。
我成功发送了一封测试电子邮件,但在此过程中,gpg
要求我输入创建密钥时使用的密码gpg --full-generate-key
。
鉴于脚本将在无人值守的情况下运行,我需要使用 缓存密码gpg-preset-passphrase
。但是,当我运行/usr/lib/gnupg2/gpg-preset-passphrase --preset <keygrip>
使用 获取 keygrip 的位置时gpg --list-keys --with-keygrip
,我收到错误消息:gpg-preset-passphrase: caching passphrase failed: Not supported
。
gpg 2.2.12
作为参考,我在运行 Raspbian Buster 的 Raspberry Pi 2 Model B 上使用。
请协助。
答案1
必须首先~/.gnupg/gpg-agent.conf
使用以下选项启用此功能:
allow-preset-passphrase
编辑配置后可能就足够了gpg-connect-agent reloadagent /bye
,或者您可能需要完全重新启动代理。
请注意,预设密码仅存储在内存中 - 重启后不会保留。(无论如何,gpg-agent 如何安全地存储它?)
答案2
这个很好的线程为我提供了将 GPG 密钥和密码自动加载到 gpg-agent 的最后步骤:
在我的上下文中,我已经在 .gnupg 文件夹中安装了一个 GPG 密钥。一切都在以下 bash 函数中完成:gpg_agent_preset()
其他功能都是DRY代码以避免重复。;-)
gpg-connect-agent -q 'keyinfo --list' /bye
在我的上下文中提供 keygrip ID。如果您的上下文有多个 GPG 密钥,您可以使用以下命令获取 keygripgpg --fingerprint --with-keygrip <email>
可能看起来像:
gpg --fingerprint --with-keygrip EMAIL_OF_GPG_KEY_YOU_ARE_LOOKING_FOR | awk '/Keygrip/ { print $3}'
注意:/usr/lib/gnupg/gpg-preset-passphrase
不在路径中。
error()
{
>&2 echo "error:$*"
}
check_envvar()
{
local envvar_name=$1
# ${!varname} indirect value in bash
if [[ -z ${!envvar_name} ]]
then
error "\$$envvar_name is empty"
return 1
fi
}
gpg_agent_preset()
{
local gpg_passphrase="$1"
# authorize preset mechanism, in our context agent is not loaded yet.
echo allow-preset-passphrase >> ~/.gnupg/gpg-agent.conf
# this will start the agent ang give use keygripID
local keygrip=$(gpg-connect-agent -q 'keyinfo --list' /bye | awk '/KEYINFO/ { print $3 }')
# output looks like
#S KEYINFO B1A955E910AEFAAB2FAD9EADBFAA5C59AFAAF0AA D - - - P - - -
#S KEYINFO AAA2AAE20FCB9621D22BAFEE1C0AA2B011AA6AA6 D - - - P - - -
#OK
local k
for k in $keygrip
do
echo "$gpg_passphrase" | /usr/lib/gnupg/gpg-preset-passphrase --preset $k
done
}
玩得开心!