Xorgサーバーを起動したいと思います(新しく作成された「元の」xterm
からの最小限のtty
端末エミュレータのみを特徴とする必要があります)。これはxinit
またはstartx
を発行するのと同じくらい簡単だと思っていましたが、どちらも失敗しました。したがって、質問:
別のVT/TTYでXorgサーバーを手動で実行/初期化/起動する方法
ここで
これは背景と私がすでに試したことです:
見つめている man openvt
新しく作成されたtty
(またはvt
でシェルを実行できました。正確に異なるvt<>tty)のように:
$> Sudo openvt -s /bin/bash
-s
ofを指定すると、新しいttyでその新しいtty/vtに直接切り替えられます。手動で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.
脆弱であるため、xinit
は使用しないでください。 startx
を使用します。 xinit
は、警告やドキュメントなしで、任意のユーザーIDからのX接続を受け入れるように記述されているようです。 startx
はこれを修正しているようです。なぜこの状況が容認されたのか、そもそもそれがどのようにして起こったのかはわかりません。
X
の動作は「最近」変更されました。 X
は、set-uid rootであることに依存し、新しいVTに切り替えていました。それでも、X
はテキストVTから起動した場合にのみ機能する可能性があることに注意してください。例えば。非rootユーザーは、別のX
セッション内からX
を開始できない場合があります。言い換えれば、これがとにかくあなたが望むことをするかどうかはわかりません。
Xが変更され、代わりにcurrentVTを使用できるようになりました。 startx
などの一部のツールは、新しいデザインを使用するために動作を変更しました。
(セキュリティを向上させるために)rootとしてプログラムを起動する必要はありません。これは、代わりにlogind
、より小さなバックグラウンドサービス(root権限で開始される)を使用して機能します。
RootとしてのX
の実行に戻った場合、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
intendedこのXサーバーのような非ルートプログラムがシステムに与えるダメージの量を減らすため。AIUIの実装は非常に制限されています。リカバリキーを提供しないでください。カーネルのシステムアテンションキーを使用すると、logind
はひどく強制終了されます。)
カーネルコマンドSysRQ + Rを使用した後でも、画面を回復できませんでした。何かが壊れたと思います。おそらくlogind
またはgdm
:-)。
これが@sourcejediの私のバージョンです answer (申し訳ありませんが、コメントには入れません):
#!/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 "$@"
私のテストでは、この2行を/ etc/X11/Xwrapper.configに入れれば、コマンドはうまく機能します。
allowed_users=anybody
needs_root_rights=yes
xサーバーの起動は、デフォルトでは、ターゲット仮想端末の所有者であり、それに物理的に(キーボード)接続されているユーザーにのみ許可されているようです。 (あなたの場合:rootはvt-ownerであり、xは 'mahr'として実行しようとしました)。
この2行はその要求を上書きし、1つのコマンド、1つの端末からすべてを開始することも可能にします(initスクリプトまたはsshで始まるリモートxに便利です)。
Sudo openvt -c15 -- su user -c 'xinit /usr/bin/xterm -display :15 -- :15 vt15'