如何為 gvfs 啟動 GnuPG SSH 代理?
我使用 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 gvfsd
Nautilus 發出一聲抱怨聲後,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 會話,顯然不會將所有內容重置為與系統啟動後相同的狀態。