Линия:
var=ncdump -v i 122009.nc
должно быть:
var=$(ncdump -v i 122009.nc)
Это позволит считать результат команды в var и позже использовать для определения длины
Вот моя версия ответа @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 "$@"
Не используйте 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
:-).
по моему тесту, ваши команды будут работать хорошо, если вы поместите эти 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'