Назад | Перейти на главную страницу

Как мне правильно запустить dbus-monitor --session как root?

Я работаю над сценарием, который будет определять, заблокирован ли сеанс Gnome пользователем и когда он заблокирован, чтобы исключить этого пользователя и предотвратить блокировку экранов в лаборатории общего пользования. Однако, похоже, единственный способ сделать это - запустить dbus-monitor следующим образом:

dbus-monitor --session \ "type=signal,interface=org.gnome.ScreenSaver"

К сожалению, я не могу заставить это работать как root, сколько бы я ни пытался. Я пробовал следующее:

1

eval `dbus-launch`
dbus-monitor --session ...

Это не запускается с той же ошибкой

2

export $(dbus-launch)
dbus-monitor --session ...

Это запускается, но не отслеживает сообщения.

3

eval `dbus-launch`
export DBUS_SESSION_BUS_ADDRESS
dbus-monitor --session ...

Это запускается, но не отслеживает сообщения

Точная ошибка, когда я получаю ошибку сеанса X11, выглядит следующим образом:

Failed to open connection to session message bus: dbus-launch failed to autolaunch D-Bus session: Fd 4 did not have the close-on-exec flag set!  Setting the flag.
Xlib: connection to ":0.0" refused by server
Xlib: No protocol specified

Autolaunch error: X11 initialization failed.

Итак, мне нужно иметь возможность удаленно отслеживать сообщения сеанса org.gnome.ScreenSaver dbus (в идеале с правами root, поскольку настройка нового пользователя может быть проблемой) и я не могу понять, как это сделать. Также следует добавить, что если я вошел в систему как пользователь, я могу без проблем запустить команду dbus-monitor (она регистрируется, как и ожидалось).

Больше информации, потому что это не повредит.

Ядро: RHEL5

 2.6.18-406.el5

Версия DBUS:

D-Bus Message Bus Launcher 1.1.2

Версия GNOME:

2.16.0

Проблема в том, что dbus-monitor не знает, куда подключиться, поскольку он работает от имени другого пользователя / сеанса (root). Вы можете получить АДРЕС DBUS из среды примерно так:

DBUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pidof -s gnome-session)/environ)
dbus-monitor --session --address "$DBUS_ADDRESS"  "type=signal,interface=org.gnome.ScreenSaver"

Эти команды пытаются найти запущенный процесс с помощью pidof -s gnome-session, затем просмотрите среду и grep для DBUS_SESSION_BUS_ADDRESS и назначьте его DBUS_ADDRESS, а затем использует переменную, чтобы сообщить dbus-monitor, какую шину сообщений отслеживать.

Имейте в виду, что если у вас несколько сеансов, он будет работать только с «первым».