如何在不同的 VT/TTY 上手动运行/初始化/启动 Xorg 服务器?

如何在不同的 VT/TTY 上手动运行/初始化/启动 Xorg 服务器?

我想启动一个 Xorg 服务器(它应该只具有xterm来自新创建的“原始”的最小终端模拟器tty)。我认为这就像发出 axinit或可能 a一样简单startx,但两者都让我失望。因此问题是:

如何在不同的 VT/TTY 上手动运行/初始化/启动 Xorg 服务器?

这里的

手头问题的更长背景故事:

这是背景和我已经尝试过的:

看看man openvt我能够在新创建的tty(或者vt,无法准确说出不同的VT<>终端) 像这样:

 $> sudo openvt -s /bin/bash

导致-s直接切换到新 tty 上的新 tty/vt 我想手动启动一个Xorg服务器,该服务器应该man xinit以最小的应用程序启动xterm。在切换到 tty I (通过创建)的新 shell 上,openvt我因此发出以下命令:

 $> su -c 'xinit xterm -display :4 -- :4' - mahr &>/tmp/output

我收到这个输出

$> cat /tmp/output
X.Org X Server 1.19.6
Release Date: 2017-12-20
X Protocol Version 11, Revision 0
Build Operating System: Linux 4.4.0-148-generic x86_64 Ubuntu
Current Operating System: Linux scitech 4.15.0-70-generic #79-Ubuntu SMP Tue Nov 12 10:36:11 UTC 2019 x86_64
Kernel command line: BOOT_IMAGE=/vmlinuz-4.15.0-70-generic root=/dev/mapper/ubuntu--vg-root ro
Build Date: 03 June 2019  08:10:35AM
xorg-server 2:1.19.6-1ubuntu4.3 (For technical support please see http://www.ubuntu.com/support) 
Current version of pixman: 0.34.0
    Before reporting problems, check http://wiki.x.org
    to make sure that you have the latest version.
Markers: (--) probed, (**) from config file, (==) default setting,
    (++) from command line, (!!) notice, (II) informational,
    (WW) warning, (EE) error, (NI) not implemented, (??) unknown.
(==) Log file: "/home/mahr/.local/share/xorg/Xorg.4.log", Time: Thu Nov 28 10:57:53 2019
(==) Using system config directory "/usr/share/X11/xorg.conf.d"
(EE) 
Fatal server error:
(EE) parse_vt_settings: Cannot open /dev/tty0 (Permission denied)
(EE) 
(EE) 
Please consult the The X.Org Foundation support 
     at http://wiki.x.org
 for help. 
(EE) Please also check the log file at "/home/mahr/.local/share/xorg/Xorg.4.log" for additional information.
(EE) 
(EE) Server terminated with error (1). Closing log file.

Session terminated, terminating shell...xinit: giving up
xinit: unable to connect to X server: Connection refused
xinit: unexpected signal 2
 ...terminated.

答案1

不要使用xinit,因为它很容易受到攻击。使用startxxinit似乎被编写为接受来自任何用户 ID 的 X 连接,没有警告或文档。 startx似乎解决了这个问题。我不知道为什么这种情况会被容忍,也不知道它最初是如何发生的。

工作方式X“最近”发生了变化。 X过去依赖于被set-uid root,并切换到新的VT。请注意,即使如此,也X只有从文本 VT 启动它才可能有效。例如,非 root 用户可能无法X从另一个X会话中启动。换句话说,我不确定这是否会达到您想要的效果。

X 现在已被更改,以便它可以使用当前的改为VT。一些工具已经startx改变了它们的行为,以使用新的设计。

其设计是您不需要以 root 身份启动任何程序(以提高安全性)。这是通过使用logind较小的后台服务(以 root 权限启动)来实现的。

如果您返回X以 root 身份运行,则不需要 的许可logind。我认为X可能会与此保持兼容。

您似乎一直在尝试运行X而不强制其运行为满root。在这种情况下,您需要获得 的许可logindlogind允许你做某事在您登录的 VT 上。我想出了一个窍门欺骗登录

user=mahr
sudo systemd-run \
    --property PAMName=login \
    --property User="$user" \
    --property StandardInput=tty \
    --property TTYPath=/dev/tty8 \
    sh -c 'chvt 8 && exec startx /usr/bin/xterm'

感觉应该也可以动态分配 tty(使用openvt -s,以及使用该命令的脚本tty)。然而,我只是冻结了我的屏幕几次试图做到这一点:-)。

logind 故意的以减少像 X 服务器这样的非 root 程序对系统造成的损害。 AIUI对此的实现是相当有限的。它不提供恢复密钥。 logind如果您使用内核系统注意键,甚至会被严重杀死。)

即使使用内核命令 SysRQ + R,我也无法恢复屏幕。我认为可能有什么东西坏了logind或者gdm:-)。

答案2

通过我的测试,如果您将这两行放入,您的命令将运行良好/etc/X11/Xwrapper.config:

allowed_users=anybody
needs_root_rights=yes

默认情况下,X 服务器启动似乎只允许目标虚拟终端的所有者并物理(键盘)连接到它的用户。 (您的情况:root 是 vt 所有者,x 尝试以“mahr”身份运行)。

这两行会覆盖该请求,甚至可以从一个命令、一个终端启动所有内容(对于 init 脚本或以 ssh 启动的远程 x 很有用)。

sudo openvt -c15 -- su user -c 'xinit /usr/bin/xterm -display :15 -- :15 vt15'

答案3

这是我的@sourcejedi 版本回答(抱歉,它不会出现在评论中):

#!/bin/sh                     
# login-spoof

# Pretend that we're running a command after having logged into a
# given virtual terminal as us. Example:

# $ ./login-spoof 8 startx /usr/bin/xterm -- :1
# Running as unit: run-r3cc564bee3134c789c09c21faee9e710.service
# (opens xterm on /dev/tty8)

TTYNUM=$1; shift
sudo systemd-run \
    --property PAMName=login \
    --property User="$USER" \
    --property StandardInput=tty \
    --property TTYPath=/dev/tty$TTYNUM \
    sh -c 'export PATH="'$PATH'"; chvt '$TTYNUM' && exec "$@"' x "$@"

相关内容