Как вручную запустить/инициализировать/запустить сервер Xorg на другом VT/TTY?

Как вручную запустить/инициализировать/запустить сервер Xorg на другом VT/TTY?

Я хочу запустить сервер Xorg (который должен включать только минимальный xtermэмулятор терминала из недавно созданного "чистого" tty). Я думал, что это так же просто, как выдать xinitили, может быть, , startxоднако оба варианта меня подвели. Поэтому вопрос:

Как вручную запустить/инициализировать/запустить сервер Xorg на другом VT/TTY?

здесь

Более подробная предыстория рассматриваемого вопроса:

Вот фон и то, что я уже попробовал:

Глядя на то, что man openvtмне удалось запустить оболочку на недавно созданном tty(или vt, не могу точно сказать, на какомвт<>телетайп) так:

 $> sudo openvt -s /bin/bash

из -sвызывает прямое переключение на этот новый tty/vt на этом новом tty Я хотел вручную запустить Xorgсервер, который согласно man xinitдолжен запуститься с минимальным xtermприложением. На новой оболочке на переключенном на tty я (созданном через openvt) я поэтому выдаю эту команду:

 $> 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похоже, написано для принятия X-соединений от любого идентификатора пользователя, без предупреждения или документации. startxпохоже, исправляет это. Я не знаю, почему эта ситуация допускается или как она вообще произошла.

Принцип Xработы изменился "недавно". XРаньше полагались на root-уровень set-uid и переключение на новый VT. Обратите внимание, что даже тогда это Xмогло сработать только в том случае, если вы запустили его из текстового VT. Например, пользователь без прав root не сможет запустить его Xиз другого Xсеанса. Другими словами, я не уверен, сделает ли это то, что вам нужно.

X теперь изменен так, что он может использоватьтекущийВместо этого VT. Некоторые инструменты, такие как startxизменили свое поведение, чтобы использовать новый дизайн.

Дизайн заключается в том, что вам не нужно запускать никакую программу как root (для повышения безопасности). Это работает logind, используя вместо этого меньшую фоновую службу (которая запускается с привилегиями root).

Если вы вернетесь к работе Xот имени root, вам не понадобится разрешение от 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-сервер. Реализация этого довольно ограничена. Она не предоставляет ключ восстановления. logindдаже ужасно убивается, если вы используете клавишу System Attention ядра.)

Даже после использования команды ядра SysRQ + R я не смог восстановить экран. Думаю, что-то сломалось, наверное, logindили gdm:-).

решение2

по моим тестам, ваши команды будут работать хорошо, если вы вставите эти 2 строки/etc/X11/Xwrapper.config:

allowed_users=anybody
needs_root_rights=yes

похоже, что запуск X-сервера по умолчанию разрешен только пользователю, который является владельцем целевого виртуального терминала и физически (через клавиатуру) подключен к нему. (В вашем случае: владельцем виртуального терминала является root, а x пытался запуститься как «mahr»).

Эти две строки переопределяют этот запрос и делают возможным запуск всех систем из одной команды, с одного терминала (полезно для сценариев инициализации или удаленного запуска x с помощью ssh).

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 "$@"

Связанный контент