以编程方式确定 gpg-agent 是否会要求输入密码

son*_*i2f 4 gnupg

我已经gpg-agent使用缓存的密码运行了一个小时左右。我对offlineimapIMAP 同步实用程序的电子邮件帐户密码进行加密,并让脚本通过从 GPG 加密文件中解密密码来传递密码。

由于我offlineimap使用 systemd 运行,因为它是一个 cron 作业,它自然会弹出一个 pinentry 程序并要求输入密码。我想知道是否有一种方法可以以编程方式确认是否gpg-agent需要密码短语,以便我可以查询信息,并在需要交互式密码输入时优雅地退出 systemd/cron 作业。

以前有人这样做过吗?

小智 5

我只是有类似的计划,使用mbsync和定期获取/同步可能的电子邮件cron。密码由pass使用 GnuPG 来加密敏感数据来管理。

较新的 GnuPG(我使用的是 v2.1.18)必须使用gpg-agent来请求必要的密码来解密私钥。gpg-agent当我调用以获取我的电子邮件帐户的密码时,它将自动启动,pass并会弹出询问密码的pinentry对话框。

我不想将gpg-agent我的密码配置为缓存太长时间(例如,1 天甚至 1 年),并且我不想由 cron 作业触发烦人的pinentry对话框gpg-agent,它应该很安静。

我认为cron 作业将在可以解密密码mbsync时同步我的电子邮件,而不会触发询问用户密码,否则,cron 作业将退出。gpgpassgpg-agent

我发现 GnuPG 有这个--pinentry-mode选项,它可能有值:

  • default:使用代理的默认值,即ask
  • ask:强制使用 Pinentry。
  • cancel:模拟使用 Pinentry 的取消按钮。
  • error:返回 Pinentry 错误(“No Pinentry”)。
  • loopback:将 Pinentry 查询重定向到调用者。请注意,与 Pinentry 相比,如果用户输入错误的密码,则不会再次提示用户。

因此,我可以通过传递--pinentry-mode cancel或显式禁用 pinentry 使用--pinentry-mode error,并gpg尝试签名/解密消息。如果成功,则gpg-agent已经拥有缓存的密码,并且不会弹出pinentry对话框;否则,签名/解密测试就会失败。

例如:

gpg-agent不缓存所需的密码时:

$ echo "test" | \
  gpg2 --sign --batch --no-tty --pinentry-mode error \
       --local-user <you@example.com> -o /dev/null

# Return code: 2
# OUTPUT:
# gpg: signing failed: No pinentry
# gpg: signing failed: No pinentry
Run Code Online (Sandbox Code Playgroud)

gpg-agent已缓存密码时,相同的命令将成功并返回状态代码 0。

如果我使用--pinentry-mode cancel,则gpg失败Operation cancelled