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

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

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

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

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 обменивается сообщениями удаленно (идеально, поскольку корень, начиная с установки нового пользователя может быть боль), и не может выяснить, как сделать это. Нужно также добавить, что, если я вхожусь в систему в качестве пользователя, я могу выполнить dbus-команду-контроля отдельно без любых проблем (это регистрируется как ожидалось).

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

Ядро: RHEL5

 2.6.18-406.el5

Версия DBUS:

D-Bus Message Bus Launcher 1.1.2

Версия GNOME:

2.16.0
3
задан 17 June 2015 в 19:23
1 ответ

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

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, какую шину сообщения отслеживать.

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

.
5
ответ дан 3 December 2019 в 05:41

Теги

Похожие вопросы