从 X 内部将第二个 X 服务器作为 systemd 服务运行

从 X 内部将第二个 X 服务器作为 systemd 服务运行

我想从已经运行的 X 会话中启动第二个 X 服务器。

在 debian 8 之前,我可以编辑行/etc/X11/Xwrapper.config并将其更改allowed_users=consoleallowed_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,因为它很容易受到攻击。代替使用startxxinit似乎被编写为接受来自任何用户 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,您也必须克服这一点。

相关内容