1

1

Ich arbeite an einem Skript, das erkennt, ob und wann eine Gnome-Sitzung von einem Benutzer „gesperrt“ wird, um diesen Benutzer rauszuwerfen und zu verhindern, dass Leute in einem öffentlich zugänglichen Labor Bildschirme sperren. Allerdings scheint die einzige Möglichkeit, dies zu tun, darin zu bestehen, einen Dbus-Monitor wie folgt zu starten:

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

Leider kann ich dies als Root nicht zum Laufen bringen, egal wie viel ich probiere. Ich habe Folgendes versucht:

1

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

Der Start schlägt fehl, derselbe Fehler

2

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

Dies wird gestartet, die Nachrichten werden jedoch nicht erfolgreich überwacht.

3

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

Dies startet, überwacht aber nicht die Nachrichten

Der genaue Fehler, wenn ich den X11-Sitzungsfehler erhalte, ist wie folgt:

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.

Ich muss also ganz einfach in der Lage sein, die dbus-Nachrichten der Sitzung org.gnome.ScreenSaver remote zu überwachen (idealerweise als Root, da das Einrichten eines neuen Benutzers mühsam sein kann) und weiß nicht, wie das geht. Es sollte auch hinzugefügt werden, dass ich, wenn ich als Benutzer angemeldet bin, den Befehl dbus-monitor problemlos selbst ausführen kann (er protokolliert wie erwartet).

Mehr Infos, denn es kann nicht schaden.

Kernel: RHEL5

 2.6.18-406.el5

DBUS-Version:

D-Bus Message Bus Launcher 1.1.2

GNOME-Version:

2.16.0

Antwort1

Das Problem besteht darin, dass dbus-monitor nicht weiß, wohin es sich verbinden soll, da es als anderer Benutzer/Sitzung (root) ausgeführt wird. Sie können die DBUS-ADRESSE aus der Umgebung mit etwas wie folgendem abrufen:

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"

Diese Befehle versuchen, den laufenden Prozess mit zu finden pidof -s gnome-session, untersuchen dann die Umgebung, suchen mit grep nach DBUS_SESSION_BUS_ADDRESS und weisen sie DBUS_ADDRESS zu. Anschließend verwenden sie die Variable, um dbus-monitor mitzuteilen, welcher Nachrichtenbus überwacht werden soll.

Bedenken Sie, dass es bei mehreren Sitzungen nur mit der „ersten“ funktioniert.

verwandte Informationen