Ssh

從 X 會話外部確定 DBUS_SESSION_BUS_ADDRESS

  • March 29, 2021

我在執行 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包含一個不同的值,它不起作用,我找不到包含該變數正確值的文件。

為什麼我的一台機器需要更改該值,而其他機器不需要?如果這種行為有意義或難以糾正,我還能在哪裡找到該變數的正確值?

我用它來獲取它,但它依賴於正在執行的會話:

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

引用自:https://unix.stackexchange.com/questions/167023