检测快速用户切换Linux

时间:2012-05-15 19:53:23

标签: linux performance x11

我目前正在尝试检测用户何时在Linux平台上快速用户切换到另一个用户(具体来说,Fedora 14-16,RedHat 4.7-6.x,CentOS 4-6,OpenSuse 10-11 )。我一直在寻找类似于Windows上可用的WTSRegisterSessionNotification()函数的东西,但我所遇到的只是对Wine软件中的错误的一堆引用。

还有其他人遇到过这个障碍吗?关于如何在Windows和Mac OS X上执行此操作似乎有大量资源(这很好),但在Linux上似乎什么都没有......

编辑: 显然,在较新的系统上(至少Fedora 16)this似乎是一个可行的选择。我想知道它是否有一个DBus接口...更多即将推出!

3 个答案:

答案 0 :(得分:1)

首先,我需要告诉你我不是这方面的专家,但我有足够的知识给你指点你可以去的地方并了解更多。所以我在某些方面可能是错的。

我的猜测是:

  • 这不容易
  • 对于您可能实施的大多数方法,可能有很多方法可以诱使他们相信某些不正确的事情,这可能会导致安全问题
  • 您的方法可能取决于:
    • 选择了Linux Distribution
    • 发行版的版本
    • 桌面环境
    • 展示经理

据我所知(如果在过去的几年中发生了变化,我可能会出错),通过在另一个VT上启动另一个X服务器来实现快速用户切换。因此检测是否有多个X服务器正在运行。

但是在很多情况下,有多个X服务器正在运行,并且这不是因为快速用户切换。示例:Multiseat甚至简单的Xephyr登录。使用Xephyr和XDMCP,您甚至可以在非快速用户切换的情况下让相同的用户登录两次。

我开始谷歌搜索这个并找到了这个旧网页:

如果从那时起事情没有改变,你应该学习ConsoleKit和PolicyKit(以及今天的DeviceKit和Systemd)以及他们的DBus API。

还有命令ck-list-sessionsck-launch-session。但我相信您可以轻松地欺骗这些命令:尝试ck-launch-session xterm然后ck-list-session

为什么要确切地检测快速用户切换?你的最终目标是什么?也许你可以在不试图检测快速用户切换的情况下解决问题......

答案 1 :(得分:0)

看来获取此信息最有用的方法是使用ConsoleKit DBus interface

以下过程概述了如何枚举会话并确定它们是否处于活动状态:

1。)使用以下内容枚举会话:

    Bus:    org.freedesktop.ConsoleKit
    Path:   /org/freedesktop/ConsoleKit/Manager
    Method: org.freedesktop.ConsoleKit.Manager.GetSessions

返回的是导出Session接口的对象路径数组。反过来,可以使用DBus查询这些内容以获取其适当的属性。例如,我使用dbus-send与ConsoleKit进行通信以枚举系统中的会话:

dbus-send --system --print-reply --dest=org.freedesktop.ConsoleKit /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.GetSessions

我得到的回报如下:
method return sender=:1.15 -> dest=:1.205 reply_serial=2 array [ object path "/org/freedesktop/ConsoleKit/Session2" ]

2。)使用返回的对象路径,我可以查询它们的属性,例如它们是否处于活动状态,使用以下内容:

    Bus:    org.freedesktop.ConsoleKit
    Path:   /org/freedesktop/ConsoleKit/Session2
    Method: org.freedesktop.ConsoleKit.Session.IsActive

根据方法,我可以从会话中查询我需要的内容!使用ConsoleKit接口我还可以检索当前会话的标识符,因此我可以随时查询它以查看它是否在我需要时处于活动状态。只是为了好玩,这是以下命令的输出:

dbus-send --system --print-reply --dest=org.freedesktop.ConsoleKit /org/freedesktop/ConsoleKit/Session2 org.freedesktop.ConsoleKit.Session.IsActive

  
    

方法return sender =:1.15 - > dest =:1.206 reply_serial = 2        布尔值

  

答案 2 :(得分:0)

你必须通过轮询来确保在所有机器上运行(显然你不必让DBus运行来进行用户切换!)。

Solaris,HP-UX和其他人不会在控制台上进行用户切换。

支持的平台:linux,FreeBSD,AIX。 Linux / BSD使用虚拟终端;如果您有兴趣,AIX会使用/dev/lft0

假设您希望在控制台上可靠且安全地运行应用程序,并在控制台切换到另一个VT时在新的活动X服务器上重新启动它。问题是您可能会或可能不会运行桌面环境(我们中的一些人使用twm!)。该会话可能尚未通过登录管理器启动(您可以在Linux上执行Ctrl-Alt-F2,登录并非常愉快地运行startx)。系统甚至可能没有安装xdm / gdm / similar。

愚蠢的解决方案是唯一可靠的解决方案:每隔几秒,查询一下活动虚拟终端(Linux上为VT_GETSTATE,BSD上为VT_GETACTIVE)。如果它改变了,你就知道发生了转换。如果您切换到非图形会话(例如使用Ctrl-Alt-F1),则不会激活X服务器。

否则,你必须努力寻找哪个显示号码有效。例如,您可能会在ps中看到两个X服务器,显示数字为:1和:2。其中哪些是关于VT7的?拼图的最后一部分,将VT数字映射到显示数字,是最难的。这个问题在this duplicate question, "Which virtual terminal is a given X process running on?"中得到了解答。