我正在寻求缓存密码以在无人值守的计算机上使用。由于这样做会带来一些风险,因此我更愿意选择缓存哪些密码短语,并避免将 和 都设置default-cache-ttl
为max-cache-ttl
令人讨厌的高值,并避免需要gpg-agent
定期清除整个缓存 - 因此我正在寻找一种解决方案gpg-preset-passphrase
。我在故障排除时发现的一些信息涉及旧版本的 GnuPG,因此我不确定我是否充分考虑了所有差异。
首先,按照 的规定man 1 gpg-agent
,我export GPG_TTY=$(tty)
在 .bashrc 中有。
现在假设我运行eval $(gpg-agent --daemon --allow-preset-passphrase --default-cache-ttl 1 --max-cache-ttl 31536000)
启动 gpg-agent,注意到gpg-preset-passphrase 仍然遵循 --max-cache-ttl(默认 2 小时)。
$KEYGRIP
然后,我使用 获取所需秘密子密钥的keygrip gpg --with-keygrip -K
。
我就这样尝试/path/to/gpg-preset-passphrase -c $KEYGRIP
。按回车键后,将打印:
gpg-preset-passphrase: caching passphrase failed: Not implemented
再次尝试添加--verbose --debug 6 --log-file /path/to/gpg-agent.log
到gpg-agent
,我的日志附加了
gpg-agent[4206] listening on socket /run/user/1000/gnupg/S.gpg-agent
gpg-agent[4207] gpg-agent (GnuPG) 2.1.15 started
gpg-agent[4207] handler 0x7f86ef783700 for fd 5 started
gpg-agent[4207] command PRESET_PASSPHRASE failed: Not implemented
gpg-agent[4207] handler 0x7f86ef783700 for fd 5 terminated
除了深入研究源代码之外,我不确定从哪里开始,所以我想知道是否有人可以首先纠正我正在采取的步骤。
答案1
听起来您想通过标准输入gpg-preset-passphrase
发送密码,没有回显它(以避免将其暴露在进程列表中):
/path/to/gpg-preset-passphrase -c $KEYGRIP <<< $PASSPHRASE
如果您关心 bash 之外的可移植性:
/path/to/gpg-preset-passphrase -c $KEYGRIP <<EOF
$PASSPHRASE
EOF
这个关于“Here Documents”语法(EOF)的答案对我来说非常宝贵:https://unix.stackexchange.com/a/88492
你还需要像霍尔姆斯提到的那样allow-preset-passphrase
。~/.gnupg/gpg-agent.conf
如果您想使用对称加密来做到这一点(因为我已经对此失去了理智,也许您不必这样做),请参阅我的答案,找到正确的 keygrip/cacheid 用于在 gpg- 中预设密码代理人:https://superuser.com/a/1485486/1093343
答案2
我也遇到了这个问题,我已经通过向 gpg-agent 添加配置解决了,你可以在这里找到它:
https://stackoverflow.com/questions/49491679/how-to-enter-gnupg-agent-key-passhprase-from-cli