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

나는 이것을 얻기 위해 이것을 사용하지만 실행중인 세션에 따라 다릅니다.

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

관련 정보