Ssh
從 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_ADDRESS
為unix:abstract=/tmp/dbus-ToCuEUyLn0,guid=9296df6ba791b044d4236e45545fbe55
(它在本地終端中的值)可以讓事情像我期望的那樣通過 SSH 工作。但是,~/.dbus/session-bus/*-0
包含一個不同的值,它不起作用,我找不到包含該變數正確值的文件。為什麼我的一台機器需要更改該值,而其他機器不需要?如果這種行為有意義或難以糾正,我還能在哪裡找到該變數的正確值?
我用它來獲取它,但它依賴於正在執行的會話:
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”更改為您擁有的任何其他會話(它必須正在執行)。
基本上@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