从文档中,我可以使用这样的自定义配置运行 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
问题:
在运行上述示例命令时,如何使 gpg-agent 使用自定义配置?
如果问题 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
。