當代理在執行特定 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
問題:
- 執行上述範例命令時,如何使 gpg-agent 使用自定義配置?
- 如果問題 1) 不可能,在執行上面給出的將自動執行 gpg-agent 的命令範例時,如何防止 gpg-agent 執行?
這已經一年多了。所以,我解決了這個問題。該問題是由使用
--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
to use custom 選項,然後使用systemctl --user start gpg-agent
. 之後,每個 gpg 命令都將使用此程序而不是創建新程序。也可以查看執行的目前程序 ID,gpg-agent
我可以這樣做:systemctl --user status gpg-agent
所以,以上回答了我之前的第一個和第二個問題。第二個問題不會阻止 gpg-agent 執行,但它不會創建額外的 gpg-agent 程序,因為這是我之前試圖解決的問題,因為我有多個 gpg-agent 程序正在執行,導緻密碼驗證時出錯正在使用
--daemon
選項執行;我在這裡提到的錯誤也在上面的 gpg 錯誤跟踪器中描述。所以我的第二個問題的目標是試圖阻止每個 gpg 命令自動啟動 gpg-agent 以便我可以手動啟動它們。--supervised
但是在使用選項時我不再需要這種方法了。