在系统上有一对等效的用户帐户。
更具体地说,对于给定的一对:
- 两个帐户都是普通的 Unix 帐户,只是碰巧被同一个物理用户(人)使用。 - 同一个人几乎总是同时打开两个图形化的 X 会话,每个用户帐户一个,但只需要在屏幕上看到一个。 - 这些是完全独立的帐户,具有不同的邮件配置、浏览器历史记录、文件和不同级别的安全性。 - 帐户之间没有共享内容,在同一个 X 会话中混合这些帐户没有意义(即使在它们之间进行复制粘贴也没有用)。 - 然而,用户需要在它们之间频繁切换。 - 可以很容易地放置一个调用 `dm-tool switch-to-user` 的按钮,但实际上用户在每次切换时都必须重新进行身份验证,这样会导致生产力下降。 - 需要的是允许在两个图形化的 X 会话之间快速切换(例如,单击面板上的按钮)而无需重新进行身份验证。
系统信息和安全影响(放宽本地安全应该没问题)
- 系统是Xubuntu 16.04 Xenial。 - X个座位,登录、锁定、切换由lightdm默认完成。
我知道在保持其他操作安全的同时放宽用户之间的安全性比通常的锁定和切换方法更复杂。幸运的是,在我们的情况下,如果一些本地安全性丢失了也没关系,因为机器在受控的场所。例如,如果解决这个需求导致某种情况(如挂起+恢复)不再自动锁定会话,对于这对用户甚至系统上的每个用户来说,这可能是可以接受的。
不过,最好让用户能够手动锁定会话。
此外,必须保留远程安全性(例如,对这些帐户的SSH访问不能受到解决此问题的影响)。
先搜索再发帖
方法1:使用lightdm工具,但进行适当调整
基本上,使用
dm-tool switch-to-user *用户名*
并确保用户的会话不被锁定。在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
的登录界面,但仍然需要进行身份验证。所以,基本上结果与dm-tool switch-to-user *username*
相同。我没有完全检查,但可能它只是按照dm-tool
引起的代码路径执行。进一步搜索
在Bug #1205384 “Lock can be circumvented by switching to console” : Bugs : lxsession package : Ubuntu中寻找线索,没有具体有效的解决方法。
我已经查看了http://archive.ubuntu.com/ubuntu/pool/main/l/lightdm/lightdm_1.18.1-0ubuntu1.tar.gz上的
dm-tool
源代码(来自Ubuntu - xenial中lightdm软件包的详细信息链接)。原则看起来是这样的:
dm-tool
可执行文件调用 dbus 向lightdm
发送消息。lightdm
在handle_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 会话以进行身份验证(关于详细信息不确定,可能运行session_child_run()
调用 PAM)。switch_authentication_complete_cb()
然后切换到现有会话或创建新会话。
下一步
我们是否可以以某种方式指示 PAM 在这种情况下允许而无需提示,但又不会影响其他情况?理想情况下,PAM 的行为只会在切换用户的情况下发生变化,而不会在登录或解锁的情况下发生变化。也许额外的 X 会话仍然会启动,但不会等待用户输入密码。
方法二:找出VT号码并使用chvt
- 随时获取与目标用户对应的VT号码(可能是因为在登录时,脚本会读取XDG_SEAT_PATH以获取座位号,然后与
Xorg
命令行连接,告诉相应的VT号码,并将结果写入常规位置)。 需要切换到用户时,获取VT号码并使用
chvt
。可能需要一些sudo配置。优点:更简单,不涉及
lightdm
、PAM或其他混乱,甚至没有明确依赖于lightdm
,因此可能在其他地方工作。- 缺点:通过hackish方式找出用户和VT号码之间的连接?
结论,重述问题
- 对第一种方法(通过
dm-tool
,PAM调整)有何评论? - 对第二种方法(通过
chvt
)有何评论?
感谢您的关注。
XDG_VTNR
环境变量,该变量直接指示VT号码,而无需连接到Xorg命令行。然而,这些变量在外部是未知的。用户可以运行一个广告脚本来公布这些变量。切换将使用chvt命令,因此可能需要sudo配置。 - Stéphane Gourichon