如何在 ConsoleKit 中激活当前会话?

如何在 ConsoleKit 中激活当前会话?

我的 USB 驱动器上有一个实时 Debian Squeeze 系统,其中包含一个用于镜像另一个驱动器的脚本。该脚本用于udisks按标签安装驱动器,但它不能在串行控制台上运行。原因是与串行控制台关联的会话似乎不是“活动的”,这意味着udisks失败并显示:

user@my-live-usb:~$ udisks --mount /dev/disk/by-label/image-data --mount-options ro
Mount failed: Not Authorized

更改allow_any密钥/usr/share/polkit-1/actions/org.freedesktop.udisks.policy没有帮助,所以我想知道如何告诉 ConsoleKit 串行控制台处于“活动”状态。尝试通过 DBUS 接口执行此操作失败:

user@my-live-usb:~$ dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Session7 org.freedesktop.ConsoleKit.Session.Activate
Error org.freedesktop.DBus.GLib.UnmappedError.CkSeatError.Code0: Unable to activate session

Session7 是在 /dev/ttyS0 上列出的会话。

那么如何让 ConsoleKit 将串行控制台识别为活动会话呢?

(在我的例子中,udisks版本是1.0.1+git20100614-3,consolekit是0.4.1-4。)

还值得注意的是,Debian 实时系统会自动将实时用户登录到所有 6 个视频控制台和串行控制台上。

答案1

目标是设置一个活动的 ConsoleKit 会话。您可以通过以下方式检查:

$ ck-list-sessions | grep active
    active = TRUE

如果有多个 ConsoleKit 会话,则一次最多只能有一个会话处于活动状态。

如果输出类似于

$ ck-list-sessions | grep active
    active = FALSE
    active = FALSE

你有一个问题,因为需要一个活动的 ConsoleKit 会话来验证通过 dbus 发送消息的东西不起作用(例如 NetworkManager,即nm-appletudisk ...)。

有多种方法可以创建(和激活)ConsoleKit 会话。显示管理器可以通过直接与 ConsoleKit 守护进程通信来设置。或者 pam 模块可以做到这一点。或者登录/X11-session-init 脚本可能会调用 ck-launch-session ,它应该创建一个活动会话(模错误)。

通常,目标应该是以这样的方式设置 ConsoleKit,以便为窗口管理器或登录 shell(不仅仅是单个脚本)获得活动会话。

要测试 ConsoleKit 系统,您可以尝试使用它ck-launch-session来创建正确的 consolekit 会话。例如,您可以这样调用您的脚本:

$ ck-launch-session ./script

要测试 ck-launch-session 是否没有错误,您可以调用

$ ck-launch-session ck-list-sessions

并检查是否有活动会话。

错误:最近推出了 ConsoleKit 系统的更新各种各样的 虫子进入脆弱的(并且过度设计的?)ConsoleKit 生态系统。

例如,在我的 Ubuntu 11.10 系统上,我必须在系统升级后停止工作后nox11pam_ck_connector.so行中删除:/etc/pam.d/common-sessionck-launch-session

--- a/pam.d/common-session      Fri May 25 10:26:53 2012 +0200
+++ b/pam.d/common-session      Fri May 25 10:39:41 2012 +0200
@@ -29,5 +29,5 @@
 session        required        pam_unix.so 
 session        optional                        pam_winbind.so 
 session        optional        pam_ecryptfs.so unwrap
-session        optional                        pam_ck_connector.so nox11
+session        optional                        pam_ck_connector.so
 # end of pam-auth-update config

现在有了这个更改,我active在通过登录启动窗口管理器时直接获得一个会话WDM

这意味着窗口管理器现在在活动的 ConsoleKit 会话中运行,并且从窗口管理器进程(例如,从 xterm)作为子进程启动的所有内容也是该会话的一部分,即不再需要额外的forck-launch-session调用nm-applet

答案2

我的会话有问题,在哪里,is-localactive哪里FALSE/bin/login用于pam_ck_connector进行适当的会话。然后我用ck-launch-session openboxin执行 xinit ~/.xinitrc。第二次会议被打破。

解决方案不是使用ck-launch-session,而是在同一个虚拟终端上执行 xinit 并保持现有的第一个本地会话处于活动状态:XINITRC=/path_to_custom/xinitrc xinit -- :1 vt1

相关内容