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

Линия:

var=ncdump -v i 122009.nc  

должно быть:

var=$(ncdump -v i 122009.nc)

Это позволит считать результат команды в var и позже использовать для определения длины

3
11.06.2020, 17:16
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 "$@"
0
20.08.2021, 10:52

Не используйте xinit, потому что он уязвим . Используйте startx. xinit, кажется, написано, чтобы принимать X-соединения от любого ID пользователя без предупреждения или документации. startx, по-видимому, исправляет это. Я не знаю, почему эту ситуацию терпят и как это вообще произошло.

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

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

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

Если вы вернетесь к запуску Xот имени root, вам не потребуется разрешение от logind. Я думаю, что X, вероятно, останется совместимым с этим.

Судя по всему, вы пытались запустить Xбез принудительного запуска на полную мощность root. В этом случае вам необходимо разрешение от logind. logindдает вам разрешение делать что-то на виртуальном компьютере, на котором вы вошли в систему . Я разработал трюк, чтобы подделать логин .

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

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

4
20.08.2021, 10:52

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

allowed_users=anybody
needs_root_rights=yes

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

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

sudo openvt -c15 -- su user -c 'xinit /usr/bin/xterm -display :15 -- :15 vt15'
2
20.08.2021, 10:52

Теги

Похожие вопросы