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 地址:

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,然后查看环境并查找 DBUS_SESSION_BUS_ADDRESS 并将其分配给 DBUS_ADDRESS,然后使用变量来告诉 dbus-monitor 要监视哪个消息总线。

请记住,如果您有多个会话,它将只与“第一个”一起工作。

相关内容