在两个打开的X会话之间切换而无需重新validation

需要:快速切换用户对。

在系统上有一对用户帐户在某种程度上是等价的。

更具体地说,对于给定的一对:

  • 这两个帐户都是常规的Unix帐户,它们恰好被同一个物理用户(人)使用。
  • 同一个人几乎总是打开两个图形X会话,每个用户帐户一个,但只需要在屏幕上一次看到一个。
  • 这些是完全独立的帐户,具有不同的邮件配置,浏览器历史记录,文件,具有不同的安全级别。
  • 帐户之间没有任何共享,在同一个X会话中混合这些帐户是没有意义的(即使这些帐户之间的复制粘贴也没用)。
  • 然而,用户需要每天多次切换它们。
  • 很容易放一个调用dm-tool switch-to-user的按钮,但实际上用户必须在每个交换机上重新进行身份validation, 就是生产力的损失。

需要允许在两个图形X会话之间快速切换(例如,在点击面板上的按钮时) 而无需重新认证

系统信息和安全隐含(放宽本地安全应该没问题)

  • 系统是Xubuntu 16.04 Xenial。
  • X座椅,登录,锁定,切换由lightdm开箱即用。

我知道,在保持其他操作安全的同时放松用户之间的安全性比通常的锁定和切换方法更复杂。 幸运的是,在我们的情况下,由于机器处于受控制的场所,因此可能会丢失一些本地安全性。 例如,如果需求的解决方案导致某些情况通常会自动锁定会话(如暂停+恢复)不再锁定,对于这对用户,甚至系统上的每个用户,都可以接受。

如果用户可以手动锁定会话,那仍然很好。

此外,必须保留远程安全性(例如,对这个问题的解决方案不得影响对这些帐户的SSH访问)。

在发布之前搜索

方法1:使用lightdm工具,但以某种方式调整

基本上,使用dm-tool switch-to-user *username*并安排用户的会话不被锁定。

工作于12.04

在Ubuntu 12.04中,我们禁用了light-locker以防止会话锁定,并在运行此命令的每个用户的桌面上设置了一个图标:

 dbus-send --system --type=method_call --print-reply --dest=org.freedesktop.DisplayManager $XDG_SEAT_PATH org.freedesktop.DisplayManager.Seat.SwitchToUser string:$CALLEDUSERNAME string:somesessionname 

这工作:会话切换到提到$CALLEDUSERNAME的用户。

16.04失败

这在16.04是不能令人满意的:它切换到预先选择了$CALLEDUSERNAME的欢迎程序,但仍需要身份validation。 所以,基本上结果与dm-tool switch-to-user *username* 。 我没有完全检查,但可能它只是与dm-tool导致完全相同的代码路径。

更多搜索

看看Bug#1205384中的提示“可以通过切换到控制台来规避锁定”:错误:lxsession包:Ubuntu ,没有具体工作。

我在http://archive.ubuntu.com/ubuntu/pool/main/l/lightdm/lightdm_1.18.1-0ubuntu1.tar.gz上查看了dm-tool源代码(来自Ubuntu上的链接- lightdm软件包详情在xenial )。

原理如下:

  • dm-tool可执行文件调用dbus向lightdm发送消息。
  • lightdmhandle_seat_call()接收dbus事件,调用seat_switch_to_user()
  • seat_switch_to_user()调用g_signal_connect (session, SESSION_SIGNAL_AUTHENTICATION_COMPLETE, G_CALLBACK (switch_authentication_complete_cb), seat); 注册回调switch_authentication_complete_cb()
  • seat_switch_to_user()然后调用session_start() ,它显然创建了一个全新的X会话以获得身份validation(不确定详细信息,可能运行调用PAM的session_child_run()
  • switch_authentication_complete_cb()然后切换到现有会话或创建新会话

下一步

在这种情况下,我们可以以某种方式指示PAM在没有提示的情况下允许,但没有这种改变会干扰任何其他情况吗? 理想情况下,PAM行为只会在切换用户案例中发生变化,而不会在登录案例或解锁案例中发生变化。 也许额外的X会话仍然会启动但不等待用户输入密码。

方法2:只计算VT数并使用chvt

  • 随时获取哪个VT对应于目标用户(可能是因为在登录时,脚本会读取XDG_SEAT_PATH以获取座位号,与Xorg命令行连接,该命令行告知相应的vt号并将结果写入常规位置)。
  • 当需要切换到用户时,获取vt号并使用chvt 。 可能需要一些sudo配置。

  • 优点:更简单,没有与lightdm ,PAM或其他任何混乱,甚至没有明确依赖lightdm所以可能在其他地方工作。

  • 缺点:找出用户和VT号码之间的连接的hackish方式?

结论,复述问题

  • 关于第一种方法的任何评论(通过dm-tool ,PAM调整)?
  • 关于第二种方法的任何评论(通过chvt )?

感谢您的关注。

总结:完成,可用,当前解决方案只有在合作的多用户环境中才可以接受,可以进行改进。

我为lightdm编写了一个可用的概念validation补丁来完成这项工作。

它做我们需要的!

请参阅下面的安装说明。

先决条件

  • 具有至少两个用户帐户的系统和愿意允许在图形会话之间快速切换而无需重新输入密码的用户。
  • 每个用户都可以使用任何完全使用lightdm桌面环境,包括使用light-locker进行会话锁定。 Unity和XFCE应该有效。

用XFCE测试。

如何使用,如何看到变化

在执行更改之前尝试此操作:

  • 让用户A打开图形会话
  • 让用户B打开另一个图形会话

现在可以从两个会话中的任何一个开始:

  dm-tool switch-to-user userA 

要么

  dm-tool switch-to-user userB 

变化的影响

如果没有更改,您将看到需要输入密码的登录提示。

通过更改,您将看到没有登录提示的立即切换。

这里的开关非常快。 比在Ubuntu 12.04中快得多,甚至在某些情况下也没有闪烁。

实际使用

为了获得最大的好处,我建议在dock / panel / wharf(在您的特定桌面环境中调用它)中的某个位置创建一个启动器图标,当点击运行时:

  dm-tool switch-to-user name-of-other-user 

安全警告

应用下面的命令lightdm系统的lightdm软件包替换为允许在当前正在图形会话中登录的任何两个用户之间进行切换的修改版本。 这削弱了系统安全性,例如用户A以图形方式登录,锁定会话,离开,用户B登录。用户B可以解锁用户A会话并在打开时切换到该会话。 反之亦然(交换A和B)。

没有管理员访问权限就无法应用更改(假定为sudo ,尤其是对于软件包安装)。

它适用于我们 ,但仍然,请注意lightdm是一个重要的包,这可能会打破它或引入其他微妙的错误。 打破它会破坏为所有用户使用图形登录会话的能力。 您完全有责任使用以下命令。 你被警告了。

持久性警告

变化几乎是永久性的。 重启后他们会留下来。 要恢复它们,请安装(使用aptitudesynaptic或其他)常规lightdm*软件包,它们将替换已更改的软件包。

请注意,每当Ubuntu更新lightdm软件包并安装更新时,它们都将还原更改。 管理员可以再次应用它们。

可能的细化(恢复安全性)

可以通过巧妙地使用例如Unix组来改进这种概念validation。 如果当前和目标用户列在任何具有常规文件名的组中, lightdm将只允许切换,如lightdm-quickswitch-anystringfoo 。 这种变化(可能与其他人一起)最终可能会合并到一些官方解决方案中。

命令

我建议在文本控制台上登录(按Ctrl-Alt-F1并登录)以执行以下步骤。 这允许重新启动lightdm而不会丢失当前shell。

将以下命令复制粘贴到bash shell中,它将调整lightdm以执行更改。

 ( set -euxv echo Making sure system has necessary packages. echo Installing packages will be done only once but might be long as it may fetch around 40Mbytes of data from the Internet. sudo apt-get install devscripts wget echo Enabling source packages in apt. sudo sed -i '/^#\sdeb-src /s/^# *//' "/etc/apt/sources.list" sudo apt-get --no-install-recommends build-dep lightdm THETEMPDIR=$( mktemp -d ) cd $THETEMPDIR echo Getting package source PKGVERSION=$( dpkg-query -W --showformat='${Package}_${Version}' lightdm ) ; echo STEM="http://archive.ubuntu.com/ubuntu/pool/main/l/lightdm/$PKGVERSION" wget "${STEM}.dsc" || true wget "${STEM}.tar.gz" || true dpkg-source -x *.dsc || true cd */ || { echo "Seems like we could not get the source using wget, try apt-get source." ; apt-get source lightdm ; cd */ ; } pwd if [ -d .pc ] then quilt push -a quilt new allow_switch_between_logged_users_without_authentication quilt add src/seat.c fi patch -p0 < 

请注意,下面的命令将立即关闭所有图形会话而无法保存数据,因此所有用户都应该正确关闭应用程序并首先保存所需的数据。

如果软件包安装得很好,可以立即激活更改:

  sudo service lightdm restart 

或者重启。

反馈

对你起作用吗? 你能想到一个变种吗? 欢迎反馈。