Bash

當代理在執行特定 gpg 命令後自動啟動時,如何使用自定義配置執行 gpg 代理?

  • September 6, 2021

從文件中,我可以像這樣使用自定義配置執行 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 執行?

這已經一年多了。所以,我解決了這個問題。該問題是由使用--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.serviceto 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但是在使用選項時我不再需要這種方法了。

引用自:https://unix.stackexchange.com/questions/609501