web-dev-qa-db-ja.com

別のVT / TTYでXorgサーバーを手動で実行/初期化/起動するにはどうすればよいですか?

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.
2
fraleone

脆弱であるため、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コマンドを使用してスクリプトを使用)。ただし、画面を数回フリーズしたばかりです:-)。

logindintendedこのXサーバーのような非ルートプログラムがシステムに与えるダメージの量を減らすため。AIUIの実装は非常に制限されています。リカバリキーを提供しないでください。カーネルのシステムアテンションキーを使用すると、logindはひどく強制終了されます。)

カーネルコマンドSysRQ + Rを使用した後でも、画面を回復できませんでした。何かが壊れたと思います。おそらくlogindまたはgdm :-)。

1
sourcejedi

これが@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 "$@"
0
Metamorphic

私のテストでは、この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'
0
Asain Kujovic