微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

检测快速用户切换Linux

我目前正在尝试检测用户在Linux平台(特别是Fedora 14-16,RedHat 4.7-6.x,CentOS 4-6,OpenSuse 10-11)上是否有快速用户切换到其他用户的情况。 我一直在寻找类似于Windows上可用的WTSRegisterSessionNotification()函数的东西,但是我所遇到的是对Wine软件中的一些错误的引用。

有没有其他人跑过这个障碍? 似乎有很多关于如何在Windows和Mac OS X(这是好的)这样做的资源,但在Linux上似乎没有什么…

编辑:显然,在较新的系统(至lessFedora 16) 这似乎是一个可行的select。 我不知道它是否有一个DBUS接口…更多即将推出!

IPC的性能:命名pipe道与套接

如何加快在Opengl窗口与开罗绘图?

Nginx + PHP-fpm假设比Apache + mod-PHP快得多

在c ++中无阻塞套接字写入性能

为什么系统调用unlink太慢?

我怎么能故意拖慢Windows?

c ++有效地读取每个X字节中的前几个字节

我可以使用哪些工具来确定应用程序的硬件要求?

如何在进程完成执行后看到/ proc / / status的内容

为什么当Nginx被用作代理时,Rails中间件开销如此之高?

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

我的猜测是:

这并不容易

对于你可能实现的大多数方法,可能有很多方法来诱使他们相信某些不真实的东西,这可能会导致安全问题

你的方法可能取决于:

选择Linux发行版

发行版本

桌面环境

显示管理器

据我所知(如果在过去几年有所改变,我可能会错),通过在另一个VT上启动另一个X服务器来实现快速用户切换。 所以一种方法是检测是否有多个X服务器在运行。

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

我开始使用Google搜索,发现这个旧的网页:

http://fedoraproject.org/wiki/Desktop/FastUserSwitching

如果事情没有改变,那么你应该学习ConsoleKit和PolicyKit(也包括DeviceKit和今天的Systemd)及其DBus API。

还有命令ck-list-sessions和ck-launch-session 。 但我相信你可以很容易地愚弄这些命令:尝试ck-launch-session xterm然后ck-list-session 。

为什么你正试图检测快速用户切换? 你的最终目标是什么? 也许你可以解决你的问题,而不会尝试检测快速用户切换…

那么看来这个信息最有用的方法是使用ConsoleKit DBus接口 。

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

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

方法返回sender =:1.15 – > dest =:1.206 reply_serial = 2布尔值true

整齐。

你必须通过轮询来确保所有机器都能正常工作(你显然不需要让DBus运行来进行用户切换)。

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

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

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

愚蠢的解决方案是唯一可靠的解决方案:每隔几秒钟,查询活动的虚拟终端是什么( VT_GETSTATE上的VT_GETACTIVE ,BSD上的VT_GETACTIVE )。 如果它改变了,你知道一个开关发生了。 如果您切换到非图形化会话(例如使用Ctrl-Alt-F1),则不会有X服务器处于活动状态。

否则,你必须很难找到哪个显示号码是活动的。 例如,您可能会在ps看到两个X服务器,显示编号为1和2。 但是,哪些是在VT7上? 映射VT数字来显示数字的最后一块难题是最难的。 这个问题在这个重复的问题,“哪个虚拟终端是一个给定的X进程运行? 。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐