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

侏儒版本:

2.16.0

答案1

問題是 dbus-monitor 不知道連接到哪裡,因為它作為不同的使用者/會話(root)運行。您可以透過以下方式從環境中取得 DBUS 位址:

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 要監視哪個訊息匯流排。

請記住,如果您有多個會話,則它僅適用於「第一個」。

相關內容