如何在不同的 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,我也無法恢復螢幕。我認為可能有什麼東西壞了logindgdm:-)。

答案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 "$@"

相關內容