¿Cómo ejecutar/iniciar/iniciar manualmente un servidor Xorg en un VT/TTY diferente?

¿Cómo ejecutar/iniciar/iniciar manualmente un servidor Xorg en un VT/TTY diferente?

Quiero iniciar un servidor Xorg (que solo debería incluir un xtermemulador de terminal mínimo a partir de un "prístino" recién creado tty). Pensé que esto era tan simple como emitir un xinito tal vez un, startxpero ambos me fallaron. Por eso la pregunta:

¿Cómo ejecutar/iniciar/iniciar manualmente un servidor Xorg en un VT/TTY diferente?

aquí el

Historia de fondo más larga de la pregunta que nos ocupa:

Este es el fondo y lo que ya he probado:

Mirando, man openvtpude ejecutar un shell en un recién creado tty(o vtno puedo decir con precisión las diferentesVermont<>tty) como esto:

 $> sudo openvt -s /bin/bash

El -sde causa el cambio directo a ese nuevo tty/vt en ese nuevo tty. Quería iniciar manualmente un Xorgservidor que, según man xinitdebería comenzar con una xtermaplicación mínima. En el nuevo shell en el tty I cambiado (creado a través de openvt), emito este comando:

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

y recibo este resultado

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

Respuesta1

No lo use xinit, porque es vulnerable.. Usar startx. xinitparece estar escrito para aceptar conexiones X de cualquier ID de usuario, sin previo aviso ni documentación. startxparece solucionar este problema. No sé por qué se tolera esta situación ni cómo ocurrió en primer lugar.

La forma de Xtrabajar ha cambiado "recientemente". Xsolía depender de ser root set-uid y cambiar a un nuevo VT. Tenga en cuenta que, incluso entonces, Xes posible que solo haya funcionado si lo inició desde un VT de texto. Por ejemplo, es posible que un usuario que no sea root no pueda iniciar Xdesde otra Xsesión. En otras palabras, no estoy seguro de si esto haría lo que quieres de todos modos.

X ahora ha sido cambiado para que pueda usar elactualVT en su lugar. Algunas herramientas como startxhan cambiado su comportamiento para utilizar el nuevo diseño.

El diseño es que no es necesario iniciar ningún programa como root (para mejorar la seguridad). Esto funciona utilizando loginden su lugar un servicio en segundo plano más pequeño (que se inicia con privilegios de root).

Si volvieras a ejecutar Xcomo root, no necesitarías permiso de logind. Creo Xque probablemente seguirá siendo compatible con esto.

Parece que ha estado intentando ejecutarlo Xsin forzarlo a ejecutarse al máximo root. En ese caso necesita permiso de logind. logindte da permiso para hacer cosasen el VT en el que inició sesión. ideé un truco parafalsificar un inicio de sesión.

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 también debería ser posible asignar el tty dinámicamente (usando openvt -sy un script usando el ttycomando). Sin embargo, acabo de congelar mi pantalla un par de veces intentando hacer eso :-).

(logind destinadopara reducir el daño que los programas no root como este servidor X pueden causar al sistema. AIUI la implementación de esto es bastante limitada. No proporciona una clave de recuperación. logindIncluso muere horriblemente si usas la clave de atención del sistema del kernel.)

Incluso después de usar el comando del kernel SysRQ + R, no pude recuperar la pantalla. Creo que algo se rompió, probablemente logindo gdm:-).

Respuesta2

Según mi prueba, tus comandos funcionarán bien si pones estas 2 líneas en/etc/X11/Xwrapper.config:

allowed_users=anybody
needs_root_rights=yes

Parece que el inicio del servidor X está permitido de forma predeterminada solo al usuario que es propietario del terminal virtual de destino y está físicamente conectado (teclado) a él. (su caso: root es vt-owner y x intentó ejecutarse como 'mahr').

Estas dos líneas anulan esa solicitud e incluso hacen posible iniciar todo desde un comando, una terminal (útil para scripts de inicio o x remotos que comienzan con ssh).

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

Respuesta3

Aquí está mi versión de @sourcejedirespuesta(lo siento, no entraría en un comentario):

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

información relacionada