X11

沒有 x 會話的 gnome-keyring 用法

  • January 21, 2020

我的案例是我有一個執行軟體開發的無頭伺服器。我通常為與它的 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 匯流排可以連接。

我找到了其他人針對此問題發布的兩種解決方案,儘管它們都不適合我。

  1. 從使用 X11 的現有會話中獲取 DBUS 埠
  2. 手動啟動新的 DBUS 埠

當附加到現有的 DBUS 埠時,基本概念是找到現有登錄會話的 PID,從 procfs 中轉儲該 PID 的環境,在其中搜尋DBUS_SESSION_BUS_ADDRESS,然後將其導出到目前環境中。由於這是用於發布會話中所有內容正在使用的 DBUS 匯流排的變數,因此設置它應該允許會話中的所有內容在公共 DBUS 匯流排上進行通信,儘管它是與不同會話相關聯的匯流排。

來源:

https ://ubuntuforums.org/showthread.php?t=1059023

https://ask.fedoraproject.org/en/question/45246/error-communicating-with-gnome-keyring-daemon-in-ssh- session/

添加到我的 .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 更改為每個會話執行一個實例,而不是每個系統執行一個實例,但尚不清楚。

資料來源:

從數字 8 開始:https://support.wandisco.com/index.php?/Knowledgebase /Article/View/362/17/how-to-setup-encrypted-svn-password-storage-using-gnome- keyring-in-an-ssh-session

如何在升級的情況下修改 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 會話,至少要提示您輸入主密鑰。所以,按設計讓它執行是不可能的……不是嗎?

編輯:也許不是那麼不可能。看到這個文章,看起來類似於你的問題:

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