从X会话外部确定DBUS_SESSION_BUS_ADDRESS


8

我已经在运行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包含一个不同的值,这是行不通的,而且我找不到包含该变量正确值的文件。

为什么我的一台机器要求更改该值,而其余的则不需要?如果该行为有意义或难以纠正,那么我还要在哪里寻找该变量的正确值?


作为一个hack,您可以只在您的进程列表中查找它,如下所示: DBUS_SESSION_BUS_ADDRESS=$(ps -fwu $(whoami) | sed -n 's/.*[d]bus.*--address=\(.*\)/\1/p') 不完美,不可靠,但在大多数情况下都应该起作用。
齐柏林飞艇

Answers:


2

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

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”更改为您拥有的其他任何会话(必须正在运行)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.