首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检测快速用户交换机Linux

检测快速用户交换机Linux
EN

Stack Overflow用户
提问于 2012-05-16 03:53:23
回答 3查看 528关注 0票数 2

我目前正在尝试检测用户何时在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!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-18 03:45:40

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

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

1.)使用以下命令枚举会话:

代码语言:javascript
运行
复制
    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.)使用返回的对象路径,我可以查询它们的属性,比如它们是否处于活动状态,使用以下命令:

代码语言:javascript
运行
复制
    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

干净利落。

票数 0
EN

Stack Overflow用户

发布于 2012-05-16 20:32:33

首先,我需要告诉你,我不是这个领域的专家,但我有足够的知识给你指点,你可以去哪里学习更多。所以在某些方面我可能是错的。

我的猜测是:

对于你可能实现的大多数方法来说,这并不容易,可能有很多方法可以让他们相信一些不真实的东西,这可能会导致安全问题,因为你的方法可能依赖于:

  • Distribution

  • version of

  • Distribution

  • version of

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

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

我开始用谷歌搜索这件事,发现了这个老网页:

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

如果从那时起一切都没有改变,那么您应该学习ConsoleKit和PolicyKit (还有DeviceKit,也许现在的Systemd )以及它们的DBus API。

还有ck-list-sessionsck-launch-session命令。但我相信你可以很容易地欺骗这些命令:尝试ck-launch-session xterm,然后ck-list-session

您到底为什么要检测快速的用户切换?你的终极目标是什么?也许你可以在不尝试检测快速用户切换的情况下解决你的问题。

票数 1
EN

Stack Overflow用户

发布于 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?"中得到了回答。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10607832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档