다른 VT/TTY에서 Xorg 서버를 수동으로 실행/초기화/시작하는 방법은 무엇입니까?

다른 VT/TTY에서 Xorg 서버를 수동으로 실행/초기화/시작하는 방법은 무엇입니까?

Xorg 서버를 시작하고 싶습니다( xterm새로 생성된 "원시" 서버의 최소한의 터미널 에뮬레이터 만 있어야 합니다 tty). 나는 xinita 또는 a 를 발행하는 것만큼 간단 할 것이라고 생각했지만 startx둘 다 실패했습니다. 질문은 다음과 같습니다.

다른 VT/TTY에서 Xorg 서버를 수동으로 실행/초기화/시작하는 방법은 무엇입니까?

여기

당면한 문제에 대한 더 긴 뒷이야기:

배경과 제가 시도한 것은 다음과 같습니다.

man openvt새로 생성된 항목에서 무엇을 할 수 있는지 살펴보겠습니다 tty(또는 vt차이를 정확히 알 수 없음).버몬트<>단말기) 이와 같이:

 $> sudo openvt -s /bin/bash

새 tty에서 새 tty/vt로 직접 전환 됩니다 . 최소한의 응용 프로그램으로 시작 해야 하는 서버를 -s수동으로 시작하고 싶습니다 . 따라서 tty I(작성자)로 전환된 새 쉘에서 다음 명령을 실행합니다.Xorgman xinitxtermopenvt

 $> 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공격에 취약하므로 사용하지 마세요.. 사용 startx. xinit경고나 문서 없이 모든 사용자 ID의 X 연결을 허용하도록 작성된 것 같습니다. startx문제를 해결하는 것 같습니다. 나는 이것이 왜 용납되는지, 처음에 어떻게 이런 일이 일어났는지 전혀 모릅니다.

일하는 방식이 X'최근' 바뀌었습니다. Xset-uid 루트에 의존하고 새 VT로 전환하는 데 사용됩니다. 이 방법도 X텍스트 VT에서 실행하는 경우에만 작동할 수 있습니다. 예를 들어, 루트가 아닌 사용자는 X다른 X세션에서 시작하지 못할 수도 있습니다. 즉, 이것이 원하는 효과를 얻을 수 있을지 확신할 수 없습니다.

X를 사용할 수 있도록 변경되었습니다.현재의VT로 변경하세요. 일부 도구는 startx새로운 디자인을 사용하도록 동작을 변경했습니다.

보안 강화를 위해 루트로 프로그램을 시작할 필요가 없도록 설계되었습니다. 이는 logind더 작은 백그라운드 서비스(루트 권한으로 시작)를 사용하여 달성됩니다.

루트로 다시 X실행하는 경우에는 권한이 필요하지 않습니다 logind. 나는 X이것과 호환되는 것이 가능할 것이라고 생각합니다.

X강제로 전체 실행을 실행하지 않고 실행하려고 하는 것 같습니다 root. 이 경우 허가를 받아야 합니다 logind. logind당신이 뭔가를 할 수 있도록 허용로그인한 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 서버와 같은 루트가 아닌 프로그램으로 인해 시스템에 발생하는 피해를 줄이기 위해. AIUI의 구현은 매우 제한적입니다. 복구 키를 제공하지 않습니다. logind커널 시스템 주의 키를 사용하면 심각한 사망에 이를 수도 있습니다. )

커널 명령 SysRQ + R을 사용해도 화면을 복원할 수 없습니다. 나는 아마도 뭔가가 고장 났 logind거나 뭔가가 있다고 생각했습니다 gdm:-).

답변2

내 테스트에 따르면 다음 두 줄을 입력하면 명령이 제대로 실행됩니다./etc/X11/Xwrapper.config:

allowed_users=anybody
needs_root_rights=yes

기본적으로 X 서버 시작은 대상 가상 터미널의 소유자이고 물리적(키보드)으로 연결된 사용자만 허용하는 것으로 보입니다. (귀하의 경우: 루트는 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 "$@"

관련 정보