
Xorgサーバーを起動したいです(xterm
新しく作成された「raw」サーバーの最小限の端末エミュレーターのみが必要ですtty
)。私はxinit
aまたはaを発行するのと同じくらい簡単だと思いましたが、startx
どちらも失敗しました。質問は次のとおりです。
他のVT / TTYでXorgサーバーを手動で実行/初期化/起動する方法は?
ここ
当面の問題についてのより長い後の話:
背景と私が試したことは次のとおりです。
man openvt
新しく作成されたアイテムで何ができるかを見てみましょうtty
(またはvt
違いを正確に知りません)。バーモント<>端末)このように:
$> sudo openvt -s /bin/bash
新しいttyから新しいtty / vtに直接切り替えられます。最小限のアプリケーションで起動する必要があるサーバーを-s
手動で起動したいと思います。したがって、tty I(作成者)に切り替えられた新しいシェルで次のコマンドを実行します。Xorg
man xinit
xterm
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
警告や文書なしですべてのユーザーIDのX接続を許可するように作成されたようです。 startx
問題を解決しているようです。私はこれがなぜ受け入れられるのか、最初にこのようなことが起こったのかどうかわかりません。
働く方法がX
「最近」変わりました。 X
set-uidルートに依存し、新しいVTに切り替えるために使用されます。この方法もX
テキストVTで実行している場合にのみ機能できます。たとえば、root 以外のユーザーはX
別のX
セッションで開始できない場合があります。つまり、これが望ましい効果を得ることができるかどうかはわかりません。
Xを使用できるように変更されました。現在のVTに変更してください。いくつかのツールは、startx
新しいデザインを使用するように動作を変更しました。
セキュリティを強化するためにrootとしてプログラムを起動する必要がないように設計されています。これは、logind
より小さなバックグラウンドサービス(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
故意にX サーバーなどの非 root プログラムによってシステムに発生するダメージを軽減するため。 AIUIの実装は非常に限られています。回復キーを提供しません。 logind
カーネルシステムの注意キーを使用すると、重大な死亡につながる可能性があります。 )
カーネルコマンドSysRQ + Rを使用しても画面を復元できません。私はおそらく何かが壊れているlogind
か、何かがあると思いましたgdm
:-).
答え2
私のテストでは、次の2行を入力するとコマンドが正しく実行されます。/etc/X11/Xwrapper.config:
allowed_users=anybody
needs_root_rights=yes
デフォルトでは、Xサーバーの起動はターゲット仮想端末の所有者であり、物理(キーボード)で接続されているユーザーのみが許可されているようです。 (あなたの場合:rootはvtの所有者で、xは「mahr」として実行しようとしています。)
これらの2行は要求を無視し、1つのコマンド、1つの端末ですべてを開始します(initスクリプトまたはsshで始まるリモートxに役立ちます)。
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 "$@"