Я работаю над скриптом, который будет определять, когда и если сеанс 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, какую шину сообщений отслеживать.
Имейте в виду, что если у вас несколько сеансов, то это сработает только с «первым».