1

1

Я работаю над скриптом, который будет определять, когда и если сеанс 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

решение1

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

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

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

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

Связанный контент