当代理运行特定的 gpg 命令后自动启动时,如何使用自定义配置运行 gpg 代理?

当代理运行特定的 gpg 命令后自动启动时,如何使用自定义配置运行 gpg 代理?

从文档中,我可以使用这样的自定义配置运行 gpg-agent,我认为这是官方方式:

以下 gpg-agent.conf 包含以下内容:

allow-preset-passphrase
default-cache-ttl 34560000
max-cache-ttl 34560000

并使用自定义配置运行 gpg-agent:

#!/bin/bash
GPG_CONFIG_FILE="/opt/gpg-agent.conf"
gpg-agent --options $GPG_CONFIG_FILE --daemon

根据我的观察,gpg-agent 可以完美地读取自定义配置,没有任何问题。

但是,然后我注意到,如果 gpg-agent is not running,那么当我运行 gpg 命令时它就会automatically run gpg-agent。这是调用 gpg-agent 并自动启动它的命令示例:

1) echo RELOADAGENT | gpg-connect-agent # Reload and forget passphrase of gpg-agent
2) KEY_GRIP=$(gpg --with-keygrip --list-secret-keys $KEY_ID | grep -Pom1 '^ *Keygrip += +\K.*') # List key grip for that key_id

问题是上述命令没有使用自定义配置运行 gpg-agent。我正在编写一个 bash 脚本,其中将在脚本自己的路径中自动使用预定义值生成配置(如果不存在)。因此该脚本将仅使用此自定义配置,而不是在 ~/.gnupg 中。

$ ls
myscript.sh
conf/gpg-agent.conf

问题:

  1. 在运行上述示例命令时,如何使 gpg-agent 使用自定义配置?

  2. 如果问题 1) 不可能,那么在执行上面给出的将自动运行 gpg-agent 的命令示例时,如何防止 gpg-agent 运行?

答案1

这已经一年多了。所以,我解决了这个问题。该问题是由使用错误引起的--daemon此处描述的选项的错误引起的:https://dev.gnupg.org/T5076,

简而言之,如果当我们尝试执行 gpg 命令时现有进程已经存在,则 gpg-agent 不应生成另一个进程,但它顽固地不使用现有的 gpg-agent 进程并在不使用自定义配置的情况下创建自己的随机进程。

因此,在我的例子中,systemd 用户的解决方案是,我需要--supervised在启动 gpg-agent 时使用该选项。永远不要使用该--daemon选项。

更多细节:

使用该--supervised选项并不像使用--daemon选项运行它那样简单。这种监督模式需要服务文件和套接字文件相互通信,并且必须通过systemctl.以下是 systemd 文件(此链接描述了如何启用它的所有内容):

https://github.com/gpg/gnupg/tree/master/doc/examples/systemd-user

所以我可以修改gpg-agent.service为使用自定义选项,然后使用 启动 gpg-agent systemctl --user start gpg-agent。之后,每个 gpg 命令都将使用此进程,而不是创建新进程。要查看正在运行的当前进程 ID,gpg-agent我可以这样做:

systemctl --user status gpg-agent

那么,上面回答了我之前的第一个问题和第二个问题。第二个问题不会阻止 gpg-agent 运行,但它不会创建额外的 gpg-agent 进程,因为这是我之前试图解决的问题,因为我运行了多个 gpg-agent 进程,导致密码验证错误正在使用--daemon选项运行;我在这里提到的错误也在上面的 gpg bug tracker 中进行了描述。所以我第二个问题的目标是试图阻止每个 gpg 命令自动启动 gpg-agent ,以便我可以手动启动它们。但使用选项时我不再需要这个方法了--supervised

相关内容