从 X 会话外部确定 DBUS_SESSION_BUS_ADDRESS

从 X 会话外部确定 DBUS_SESSION_BUS_ADDRESS

我在运行 Linux Mint 16 的计算机上安装了 mate-screensaver。在该计算机上,我可以打开终端并查询屏幕保护程序的状态:

dan@box1 ~ $ echo $DISPLAY
:0.0
dan@box1 ~ $ mate-screensaver-command -q
The screensaver is inactive
The screensaver is not inhibited

这一切都运行良好并且有意义。但是,当我通过 SSH 连接到同一台机器时,我没有得到预期的结果:

dan@box2 ~ $ ssh box1
dan@box1 ~ $ export DISPLAY=:0.0
dan@box1 ~ $ echo $DISPLAY
:0.0
dan@box1 ~ $ mate-screensaver-command -q
** Message: Screensaver is not running!

同样的方法适用于我所有其他计算机,所有计算机都运行不同版本的 Mint。登录到我的~/.xsession-errors.

看完之后这个答案,我发现将 my 设置DBUS_SESSION_BUS_ADDRESSunix:abstract=/tmp/dbus-ToCuEUyLn0,guid=9296df6ba791b044d4236e45545fbe55(其在本地终端中的值)可以使事情通过 SSH 按我的预期工作。但是,~/.dbus/session-bus/*-0包含不同的值,这不起作用,并且我找不到包含该变量的正确值的文件。

为什么我的一台机器需要更改该值,而其他机器则不需要?如果这种行为有意义或者纠正起来很复杂,我还能在哪里寻找该变量的正确值?

答案1

我用它来获取它,但它依赖于正在运行的会话:

if [[ -z $DBUS_SESSION_BUS_ADDRESS ]]; then
    pgrep "gnome-session" -u "$USER" | while read -r line; do
        exp=$(cat /proc/$line/environ | grep -z "^DBUS_SESSION_BUS_ADDRESS=")
        echo export "$exp" > ~/.exports.sh
        break
    done
    if [[ -f ~/.exports.sh ]]; then
        source ~/.exports.sh
    fi
fi

将“gnome”更改为您拥有的任何其他会话(它必须正在运行)。

答案2

基本上是 @dashey 的答案,但已更新以防止warning: command substitution: ignored null byte in input警告,并且不使用文件作为环境变量:

if [[ -z $DBUS_SESSION_BUS_ADDRESS ]]; then
  while read -r sessionId; do
    # so for each session id, grep the environment from /proc/id/environ for the dbus address
    grepVarMatch=$(grep -z "^DBUS_SESSION_BUS_ADDRESS=" /proc/$sessionId/environ | tr -d '\0')
    if [[ "$grepVarMatch" != "" ]]; then
      # set the address as an envvar in the sudo env
      export DBUS_SESSION_BUS_ADDRESS="${grepVarMatch#*=}"
      break # if we found it, we don't need to look further
    fi
  done <<< "$(pgrep "gnome-session" -u "$USER")"
fi

相关内容