我的用例是,我有一台无头服务器,可以在该服务器上进行软件开发。我通常为与它的SSH连接启用X11转发,但是无法为连接较慢的遥远位置启用X11转发。
我需要安全的存储和git凭据缓存,因为我经常在树中使用18-20个存储库,因此我将git-credential-gnome-keyring用作git credential.helper,它使用libgnome-keyring进行通信到gnome-keyring-daemon。为了测试解决方案,我安装了一台带有监视器的PC,确认默认情况下该系统上的密钥环有效,然后使用SSH进行了尝试。它与X11转发一起使用,但没有它就无法工作。
在没有X11转发的情况下进行连接时,查询密钥环时会出现以下错误,并且该工具将退回到命令行提示符下:
** (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 https://ask.fedoraproject.org/en/question/45246/error-communication-with-gnome-keyring-daemon-in-ssh-会话/
添加到我的.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- ssh会话中的keyring
如何在升级的情况下修改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)还是守护程序。
我该如何工作?