Como executar/iniciar/iniciar manualmente um servidor Xorg em um VT/TTY diferente?

Como executar/iniciar/iniciar manualmente um servidor Xorg em um VT/TTY diferente?

Quero iniciar um servidor Xorg (que deve apresentar apenas um xtermemulador de terminal mínimo de um "primitivo" recém-criado tty). Achei que isso fosse tão simples quanto emitir um xinitou talvez um, startxmas ambos falharam. Portanto a questão:

Como executar/iniciar/iniciar manualmente um servidor Xorg em um VT/TTY diferente?

aqui o

História de fundo mais longa para a questão em questão:

Este é o pano de fundo e o que eu já tentei:

Olhando, man openvtconsegui executar um shell em um recém-criado tty(ou vtnão consigo dizer com precisão os diferentesvt<>tty) assim:

 $> sudo openvt -s /bin/bash

o -sde causa a mudança direta para aquele novo tty/vt naquele novo tty. Eu queria iniciar manualmente um Xorgservidor que de acordo com man xinitdeveria começar com um xtermaplicativo mínimo. No novo shell alterado para tty I (criado via openvt), emito este comando:

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

e eu recebo esta saída

$> 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.

Responder1

Não use xinit, porque é vulnerável. Usar startx. xinitparece ter sido escrito para aceitar conexões X de qualquer ID de usuário, sem aviso ou documentação. startxparece consertar isso. Não sei por que esta situação é tolerada ou como aconteceu em primeiro lugar.

A forma como Xfunciona mudou “recentemente”. Xcostumava confiar em ser set-uid root e mudar para um novo VT. Observe que, mesmo assim, Xsó poderia ter funcionado se você iniciasse a partir de um VT de texto. Por exemplo, um usuário não root pode não conseguir iniciar Xde dentro de outra Xsessão. Em outras palavras, não tenho certeza se isso faria o que você deseja de qualquer maneira.

X agora foi alterado para que possa usar oatualEm vez disso, VT. Algumas ferramentas como startxmudaram seu comportamento para usar o novo design.

O design é que você não precisa iniciar nenhum programa como root (para melhorar a segurança). Isso funciona usando logindum serviço de segundo plano menor (que é iniciado com privilégios de root).

Se você voltasse a executar Xcomo root, não precisaria da permissão do logind. Acho que Xprovavelmente permanecerá compatível com isso.

Parece que você está tentando executar Xsem forçar a execução completa root. Nesse caso você precisa da permissão do logind. logindte dá permissão para fazer coisasno VT em que você fez login. Eu desenvolvi um truque parafalsificar um login.

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'

Parece que também deveria ser possível alocar o tty dinamicamente (usando openvt -se um script usando o ttycomando). No entanto, congelei minha tela algumas vezes tentando fazer isso :-).

(logind pretendidopara reduzir quantos danos programas não-root como este servidor X podem causar ao sistema. AIUI a implementação disso é bastante limitada. Ele não fornece uma chave de recuperação. logindaté morre horrivelmente se você usar a chave de atenção do sistema do kernel.)

Mesmo depois de usar o comando do kernel SysRQ + R, não consegui recuperar a tela. Acho que algo quebrou, provavelmente logindou gdm:-).

Responder2

pelo meu teste, seus comandos funcionarão bem se você colocar essas 2 linhas/etc/X11/Xwrapper.config:

allowed_users=anybody
needs_root_rights=yes

parece que a inicialização do servidor X é, por padrão, permitida apenas ao usuário que é o proprietário do terminal virtual de destino e está fisicamente (teclado) conectado a ele. (seu caso: root é vt-owner e x tentou rodar como 'mahr').

Essas duas linhas substituem essa solicitação e tornam possível iniciar tudo a partir de um comando, um terminal (útil para scripts de inicialização ou x remoto começando com ssh).

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

Responder3

Aqui está minha versão do @sourcejediresponder(desculpe, não entraria em um comentário):

#!/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 "$@"

informação relacionada