我想从已经运行的 X 会话中启动第二个 X 服务器。
在 debian 8 之前,我可以编辑行/etc/X11/Xwrapper.config
并将其更改allowed_users=console
为allowed_users=anybody
.这允许我作为非特权用户从 X 中运行 X。X 是 Xorg 的 setuid 包装器。
debian 9 中的情况发生了变化,X 不再是 setuid 包装器,而是 X 所需的权限由 systemd 控制。该文件/etc/X11/Xwrapper.config
不再存在。
可以使用 package 恢复遗留行为xserver-xorg-legacy
。然后/etc/X11/Xwrapper.config
必须包含行
allowed_users=anybody
needs_root_rights=yes
另一种可能性是切换到 tty1...tty6 之一并运行 X,xinit xterm -- :1 vt1
而 vt1...vt6 必须符合 tty1...tty6。 (tty8...tty12 / vt8...vt12 不再可用。)
我想避免使用旧设置并避免切换到控制台。我想要找回 的可能性xinit xterm -- :1 vt8
。
如何设置 systemd 以允许非特权用户从已运行的 X 中启动第二个 X 服务器?
答案1
我建议不要使用xinit
,因为它很容易受到攻击。代替使用startx
。 xinit
似乎被编写为接受来自任何用户 ID 的 X 连接,没有警告或文档。 startx
似乎解决了这个问题。我不知道为什么这种情况会被容忍,也不知道它最初是如何发生的。
作为根用户:
systemd-run --property PAMName=login \
--property User=my-user \
--property StandardInput=tty \
--property TTYPath=/dev/tty8 \
sh -c 'chvt 8 && startx /usr/bin/xterm -- :1'
神奇之处在于定义PAMName=
、打开 PAM 会话,并将该会话与特定的 TTY 相关联。这得到pam_systemd做你想做的事。我进行了欺骗login
- 尽管从技术上讲,您应该定义一个新的 PAM“服务名称”,以防它需要一些特殊处理。
因此,您可以编写一个执行所需命令的脚本。然后使用 授予访问权限以 root 身份运行该脚本sudo
。
如果您使用 SELinux,您也必须克服这一点。