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

読んだ後この回答DBUS_SESSION_BUS_ADDRESS、myを(ローカル端末の値)に設定すると、unix:abstract=/tmp/dbus-ToCuEUyLn0,guid=9296df6ba791b044d4236e45545fbe55SSHを介して期待どおりに機能することがわかりました。ただし、~/.dbus/session-bus/*-0他の値を含めると機能しなくなり、変数の正しい値を含むファイルが見つかりません。

私のコンピュータの1つはこの値を変更する必要がありますが、他のコンピュータは変更しないのですか?この動作が妥当であるか修正するのが複雑な場合は、この変数の正しい値を他の場所で見つけることができますか?

答え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

関連情報