我目前正在尝试检测用户何时在Linux平台上快速切换到另一个用户(具体地说,Fedora14-16、RedHat 4.7-6.x、CentOS 4-6、OpenSuse 10-11)。我一直在寻找类似于Windows上可用的WTSRegisterSessionNotification()函数的东西,但我遇到的所有东西都是对Wine软件中的bug的引用。
还有没有其他人遇到过这个问题?在Windows和Mac上似乎有很多关于如何做到这一点的资源(这很好),但在Linux上似乎什么都没有……
编辑:显然,在较新的系统(至少是Fedora16)上,this似乎是一个可行的选择。我想知道它是否很快就会有一个DBus interface...More!
发布于 2012-05-18 03:45:40
现在看来,获取此信息的最有用的方法是使用ConsoleKit DBus interface。
以下过程概述了如何枚举会话并确定它们是否处于活动状态:
1.)使用以下命令枚举会话:
Bus: org.freedesktop.ConsoleKit
Path: /org/freedesktop/ConsoleKit/Manager
Method: org.freedesktop.ConsoleKit.Manager.GetSessions
返回的是导出会话接口的对象路径数组。反过来,可以使用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
方法返回sender=:1.15 -> dest=:1.206 reply_serial=2 boolean true
干净利落。
发布于 2012-05-16 20:32:33
首先,我需要告诉你,我不是这个领域的专家,但我有足够的知识给你指点,你可以去哪里学习更多。所以在某些方面我可能是错的。
我的猜测是:
对于你可能实现的大多数方法来说,这并不容易,可能有很多方法可以让他们相信一些不真实的东西,这可能会导致安全问题,因为你的方法可能依赖于:
据我所知(如果在过去几年中发生了一些变化,我可能是错的),快速用户切换是通过在另一个VT上启动另一个X服务器来实现的。因此,一种方法是检测是否有多个X服务器在运行。
但在很多情况下,有多个X服务器在运行,这并不是因为快速的用户切换。示例:多套登录,甚至是简单的Xephyr登录。使用Xephyr和XDMCP,在非快速用户切换的情况下,您甚至可以让同一用户登录两次。
我开始用谷歌搜索这件事,发现了这个老网页:
如果从那时起一切都没有改变,那么您应该学习ConsoleKit和PolicyKit (还有DeviceKit,也许现在的Systemd )以及它们的DBus API。
还有ck-list-sessions
和ck-launch-session
命令。但我相信你可以很容易地欺骗这些命令:尝试ck-launch-session xterm
,然后ck-list-session
。
您到底为什么要检测快速的用户切换?你的终极目标是什么?也许你可以在不尝试检测快速用户切换的情况下解决你的问题。
发布于 2013-02-14 19:48:13
你必须通过轮询来做这件事,以确保在所有机器上都能工作(显然你不需要运行DBus来进行用户切换!)。
Solaris、HP-UX和其他操作系统不在控制台上执行用户切换。
支持的平台: linux、FreeBSD、AIX。Linux/BSD使用虚拟终端;如果您感兴趣,AIX使用/dev/lft0
。
假设您希望可靠且安全地在控制台上运行应用程序,并在控制台切换到另一个VT时在新的active X服务器上重新启动它。问题是你可能有桌面环境在运行,也可能没有(我们中的一些人使用twm!)。会话可能不是通过登录管理器启动的(您可以在linux上使用CtrlAltF2,登录并运行startx
)。系统甚至可能没有安装xdm/gdm/类似的软件。
哑巴解决方案是唯一可靠的解决方案:每隔几秒钟查询一次活动的虚拟终端是什么( 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?"中得到了回答。
https://stackoverflow.com/questions/10607832
复制相似问题