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