1

1

Estoy trabajando en un script que detectará si un usuario "bloquea" una sesión de Gnome y cuándo para expulsarlo y evitar que las personas bloqueen pantallas en un laboratorio de uso público. Sin embargo, parece que la única forma de hacerlo es iniciar un monitor dbus de la siguiente manera:

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

Desafortunadamente no puedo hacer que esto funcione como root, no importa cuántas cosas intente. He probado lo siguiente:

1

eval `dbus-launch`
dbus-monitor --session ...

Esto no se inicia con el mismo error.

2

export $(dbus-launch)
dbus-monitor --session ...

Esto se inicia pero no monitorea correctamente los mensajes.

3

eval `dbus-launch`
export DBUS_SESSION_BUS_ADDRESS
dbus-monitor --session ...

Esto se inicia pero no monitorea los mensajes.

El error exacto cuando aparece el error de sesión X11 es el siguiente:

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.

Simplemente, necesito poder monitorear los mensajes dbus de org.gnome.ScreenSaver de la sesión de forma remota (idealmente como root, ya que configurar un nuevo usuario puede ser complicado) y no sé cómo hacerlo. También se debe agregar que si inicio sesión como usuario puedo ejecutar el comando dbus-monitor por sí solo sin ningún problema (se registra como se esperaba).

Más información porque no hace daño.

Núcleo: RHEL5

 2.6.18-406.el5

Versión DBUS:

D-Bus Message Bus Launcher 1.1.2

Versión GNOME:

2.16.0

Respuesta1

El problema es que dbus-monitor no sabe a dónde conectarse ya que se ejecuta como un usuario/sesión diferente (root). Puede obtener la DIRECCIÓN DBUS del entorno con algo como:

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"

Esos comandos intentan encontrar el proceso en ejecución pidof -s gnome-session, luego miran el entorno y buscan DBUS_SESSION_BUS_ADDRESS y lo asignan a DBUS_ADDRESS, luego usan la variable para indicarle a dbus-monitor qué bus de mensajes monitorear.

Ten en cuenta que si tienes varias sesiones solo funcionará con la "primera".

información relacionada