
Quiero iniciar un servidor Xorg (que solo debería incluir un xterm
emulador de terminal mínimo a partir de un "prístino" recién creado tty
). Pensé que esto era tan simple como emitir un xinit
o tal vez un, startx
pero 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 openvt
pude ejecutar un shell en un recién creado tty
(o vt
no puedo decir con precisión las diferentesVermont<>tty) como esto:
$> sudo openvt -s /bin/bash
El -s
de causa el cambio directo a ese nuevo tty/vt en ese nuevo tty. Quería iniciar manualmente un Xorg
servidor que, según man xinit
debería comenzar con una xterm
aplicació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
. xinit
parece estar escrito para aceptar conexiones X de cualquier ID de usuario, sin previo aviso ni documentación. startx
parece solucionar este problema. No sé por qué se tolera esta situación ni cómo ocurrió en primer lugar.
La forma de X
trabajar ha cambiado "recientemente". X
solía depender de ser root set-uid y cambiar a un nuevo VT. Tenga en cuenta que, incluso entonces, X
es 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 X
desde otra X
sesió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 startx
han 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 logind
en su lugar un servicio en segundo plano más pequeño (que se inicia con privilegios de root).
Si volvieras a ejecutar X
como root, no necesitarías permiso de logind
. Creo X
que probablemente seguirá siendo compatible con esto.
Parece que ha estado intentando ejecutarlo X
sin forzarlo a ejecutarse al máximo root
. En ese caso necesita permiso de logind
. logind
te 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 -s
y un script usando el tty
comando). 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. logind
Incluso 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 logind
o 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 "$@"