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

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

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

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

여기

당면한 질문에 대한 더 긴 배경 이야기:

이것은 배경화면이며 내가 이미 시도한 것입니다.

man openvt새로 생성된 쉘에서 쉘을 실행할 수 있었습니다 ( tty또는 vt다른 것을 정확하게 알 수 없습니다).vt<>tty) 이와 같이:

 $> sudo openvt -s /bin/bash

이로 인해 최소한의 응용 프로그램으로 시작해야 하는 서버를 -s수동으로 시작하고 싶었던 새 tty의 새 tty/vt로 직접 전환됩니다 . 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-owner이고 x는 'mahr'로 실행을 시도했습니다).

이 두 줄은 해당 요청을 무시하고 하나의 명령, 하나의 터미널에서 모두 시작할 수도 있습니다(초기 스크립트 또는 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 "$@"

관련 정보