没有 x 会话的 gnome-keyring 使用

没有 x 会话的 gnome-keyring 使用

我的用例是我有一个用于执行软件开发的无头服务器。我通常会为 SSH 连接启用 X11 转发,但对于连接速度较慢的远程位置则无法启用。
我需要安全存储和缓存我的 git 凭据,因为我经常使用树中的 18-20 个存储库,因此我使用 git-credential-gnome-keyring 作为 git credential.helper,它使用 libgnome-keyring 进行通信到 gnome-keyring-daemon。为了测试解决方案,我设置了一台带有显示器的 PC,确认密钥环在系统上默认工作,然后使用 SSH 进行尝试。它可以与 X11 转发配合使用,但如果没有 X11 转发则无法工作。

当我在没有 X11 转发的情况下进行连接时,查询密钥环时会出现以下错误,并且该工具会退回到在命令行上进行提示:

** (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-在 ssh 会话中

如何修改 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) 或守护进程是否是这种情况。

我怎样才能让它发挥作用?

答案1

这可能是一个愚蠢的答案......但是,gnome-keyring需要访问 X11 会话,至少会提示您输入主密钥。所以,按照设计,让它运行是不可能的……不是吗?

编辑:也许不是不可能的。看到这个邮政,看起来与您的问题类似:

相关内容