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

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

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

1 ответ

Решение

Проблема в том, что 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, какую шину сообщений следует отслеживать.

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

Другие вопросы по тегам