Systemd

如何為 gvfs 啟動 GnuPG SSH 代理?

  • October 28, 2020

我使用 Gnome 3.36.3 (Ubuntu 20.04.1) 和 GnuPG 2.2.19 作為 SSH 代理。

~/.profile我告訴 OpenSSH 在我的文件中哪裡可以找到 GnuPG SSH 代理套接字:

export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)

這在終端視窗中執行良好。每當我連接到遠端 SSH 伺服器時,都會提示我輸入我的 PIN。

但是,當我嘗試使用 Nautilus 連接到遠端 SFTP 伺服器時,我收到錯誤消息,或者是“未授權!”之類的消息。或者我被要求輸入使用者名和密碼(這當然不會工作,因為我只使用密鑰)。

作為一種手動解決方法,我發現,在pkill gvfsdNautilus 發出一聲抱怨聲後,SFTP 連接將按預期工作。

所以顯然gvfs在登錄後並不知道我的 GnuPG SSH 代理。但會在稍後被殺死並重新啟動時。

我該怎麼做才能讓gvfs知道我的 GnuPG SSH 代理,而無需先手動殺死?

TLDR:

sudo chmod +x /lib/systemd/user-environment-generators/90gpg-agent && reboot

長讀:

當使用 Nautilus 打開遠端位置時,gvfs-daemon 負責連接到遠端系統並在後台掛載其文件系統。

gvfs 由 systemd 管理。~/.profile並且 systemd 似乎獨立於您在or中輸入的內容來管理自己的環境~/.bashrc

不知何故,在會話後期,即打開 bash 終端視窗時,環境設置~/.profile可能~/.bashrc對新啟動的程序可用,但從一開始就不是。我不太確定這部分是如何工作的,但結果很容易觀察到:

如果您在登錄後立即查看 gvfs-daemon.service 的環境,您會看到以下內容:

# Get the PID of the running gvfsd
$ FIXME=$(systemctl --user show --property="MainPID" gvfs-daemon.service | grep -o '[0-9]*')

# Show the environment of the running gvfsd
$ tr "\0" "\n" < "/proc/${FIXME}/environ"

您將看到與使用命令的 bash 會話相比,環境要小得多env:更重要的是,gvfsd 程序環境中沒有 SSH_AUTH_SOCK 變數。

如果您現在從 bash 終端重新啟動 gvfs 服務並再次查看環境:

$ systemctl --user restart gvfs-daemon.service
$ FIXME=$(systemctl --user show --property="MainPID" gvfs-daemon.service | grep -o '[0-9]*')
$ tr "\0" "\n" < "/proc/${FIXME}/environ"

現在 SSH_AUTH_SOCK 變數存在,由 gvfs-daemon 呼叫的 SFTP 客戶端將使用 gpg-agent-socket 作為 SSH 代理,並且 Nautilus 中的遠端文件夾將按預期工作。

Debian GnuPG 軟體包維護者意識到了這個問題,並在以下位置提供了一個 systemd 使用者環境生成器腳本

/lib/systemd/user-environment-generators/90gpg-agent.

但是,該腳本的可執行位未設置,因此可能永遠不會啟動。

使其可執行並重新啟動系統後,SFTP 連接從一開始就按預期打開。

$ sudo chmod +x /lib/systemd/user-environment-generators/90gpg-agent
$ reboot

注意:在研究這個時,我多次被誤導,因為在系統上工作時環境會不斷變化。可以肯定的是,請始終執行完整的系統重啟。只需註銷並重新登錄您的 Gnome 會話,顯然不會將所有內容重置為與系統啟動後相同的狀態。

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