沒有 x 會話的 gnome-keyring 用法
我的案例是我有一個執行軟體開發的無頭伺服器。我通常為與它的 SSH 連接啟用 X11 轉發,但對於連接速度較慢的遠端位置,我不能。
我需要安全儲存和記憶體我的 git 憑據,因為我經常在樹中使用 18-20 個儲存庫,所以我使用 git-credential-gnome-keyring 作為 git credential.helper,它使用 libgnome-keyring 進行通信到 gnome-keyring-daemon。為了測試解決方案,我設置了一台帶顯示器的 PC,確認密鑰環在系統上預設工作,然後使用 SSH 進行嘗試。它適用於 X11 轉發,但沒有它就無法工作。
當我在沒有 X11 轉發的情況下連接時,在查詢 keyring 時會出現以下錯誤,並且該工具會退回到命令行提示:
** (process:18305): CRITICAL **: Error communicating with gnome-keyring-daemon
調查顯示,基本問題是 gnome-keyring-daemon 期望連接使用 dbus 與之對話。如果沒有 X11 會話,則 dbus 不會啟動,因此 gnome-keyring-daemon 和 libgnome-keyring 沒有公共 dbus 匯流排可以連接。
我找到了其他人針對此問題發布的兩種解決方案,儘管它們都不適合我。
- 從使用 X11 的現有會話中獲取 DBUS 埠
- 手動啟動新的 DBUS 埠
當附加到現有的 DBUS 埠時,基本概念是找到現有登錄會話的 PID,從 procfs 中轉儲該 PID 的環境,在其中搜尋
DBUS_SESSION_BUS_ADDRESS
,然後將其導出到目前環境中。由於這是用於發布會話中所有內容正在使用的 DBUS 匯流排的變數,因此設置它應該允許會話中的所有內容在公共 DBUS 匯流排上進行通信,儘管它是與不同會話相關聯的匯流排。來源:
https ://ubuntuforums.org/showthread.php?t=1059023
添加到我的 .bashrc 的程式碼在 ssh 登錄時執行:
if [ -z "$DBUS_SESSION_BUS_ADDRESS" ] ; then local myPID=`pgrep "(.*session|fluxbox)" | head -n1` if [ -n "$myPID" ] ; then local myVar=`cat /proc/${myPID}/environ | grep -z "^DBUS_SESSION_BUS_ADDRESS=" | sed -e 's/DBUS_SESSION_BUS_ADDRESS=//'` if [ -n "$myVar" ] ; then export DBUS_SESSION_BUS_ADDRESS=$myVar fi fi fi
第二種方法,為會話手動啟動 DBUS,涉及使用
dbus-launch
創建一個新會話並DBUS_SESSION_BUS_ADDRESS
為環境設置,然後使用所有必要的服務啟動 gnome-keyring-daemon,這樣它就會看到我們創建的 DBUS 匯流排地址而不是一個空的匯流排地址。此解決方案可能需要也可能不需要將 gnome-keyring-daemon 更改為每個會話執行一個實例,而不是每個系統執行一個實例,但尚不清楚。資料來源:
如何在升級的情況下修改 dbus 服務的“Exec”行而不失去更改
添加到我的 .bashrc 的程式碼在 ssh 登錄時執行:
# then DBUS wasn't started for this session and needs to be if [ -z "$DBUS_SESSION_BUS_ADDRESS" ] ; then # start a new dbus session and make sure the variables are exported (automatic output) eval `dbus-launch --sh-syntax` # make sure gnome-keyring-daemon is using all the necessary components (it may not be by default) # Capture the output, which is a series of variable setting commands, one on eachline, and # export them while setting them while read -r LINE do export $LINE done <<< $(gnome-keyring-daemon --start --components=gpg,pkcs11,secrets,ssh) fi
兩種解決方案都給出了相同的失敗結果。該程序沒有立即產生指示 gnome-keyring-daemon 無法通信的錯誤,而是掛起一段時間,然後產生以下輸出:
Gkr-Message: secret service operation failed: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken. ** (process:31155): CRITICAL **: Error communicating with gnome-keyring-daemon
我不清楚 gnome-keyring-daemon 如何與 DBUS 互動,但從第二組錯誤結果中可以清楚地看出它無法通過新創建的 DBUS 匯流排訪問,或者在不同的 DBUS 匯流排上進行跨程序。我發現的一些內容表明 gnome-keyring-daemon 可能需要在它之前啟動 DBUS,但不清楚是使用 (libgnome-keyring) 還是守護程序的情況。
我如何讓這個工作?
這可能是一個愚蠢的答案……但是,gnome-keyring需要訪問 X11 會話,至少要提示您輸入主密鑰。所以,按設計讓它執行是不可能的……不是嗎?
編輯:也許不是那麼不可能。看到這個文章,看起來類似於你的問題: