
Quero iniciar um servidor Xorg (que deve apresentar apenas um xterm
emulador de terminal mínimo de um "primitivo" recém-criado tty
). Achei que isso fosse tão simples quanto emitir um xinit
ou talvez um, startx
mas 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 openvt
consegui executar um shell em um recém-criado tty
(ou vt
não consigo dizer com precisão os diferentesvt<>tty) assim:
$> sudo openvt -s /bin/bash
o -s
de causa a mudança direta para aquele novo tty/vt naquele novo tty. Eu queria iniciar manualmente um Xorg
servidor que de acordo com man xinit
deveria começar com um xterm
aplicativo 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
. xinit
parece ter sido escrito para aceitar conexões X de qualquer ID de usuário, sem aviso ou documentação. startx
parece consertar isso. Não sei por que esta situação é tolerada ou como aconteceu em primeiro lugar.
A forma como X
funciona mudou “recentemente”. X
costumava confiar em ser set-uid root e mudar para um novo VT. Observe que, mesmo assim, X
só 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 X
de dentro de outra X
sessã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 startx
mudaram 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 logind
um serviço de segundo plano menor (que é iniciado com privilégios de root).
Se você voltasse a executar X
como root, não precisaria da permissão do logind
. Acho que X
provavelmente permanecerá compatível com isso.
Parece que você está tentando executar X
sem forçar a execução completa root
. Nesse caso você precisa da permissão do logind
. logind
te 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 -s
e um script usando o tty
comando). 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. logind
até 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 logind
ou 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 "$@"