web-dev-qa-db-ja.com

X内から2番目のXサーバーをsystemdサービスとして実行する

すでに実行中のXセッション内から2番目のXサーバーを起動したいと思います。

Debian 8までは、/etc/X11/Xwrapper.configを編集して、行allowed_users=consoleallowed_users=anybodyに変更できます。これにより、非特権ユーザーとしてX内からXを実行できます。XはXorgのsetuidラッパーです。

Debian 9で変更されたもの、Xはsetuidラッパーではなくなり、代わりにXに必要な特権はsystemdによって制御されます。ファイル/etc/X11/Xwrapper.configはもう存在しません。

パッケージxserver-xorg-legacyを使用してレガシー動作を復元することができます。次に、/etc/X11/Xwrapper.configに行を含める必要があります

allowed_users=anybody
needs_root_rights=yes

もう1つの可能性は、tty1 ... tty6のいずれかに切り替えて、Xをxinit xterm -- :1 vt1で実行し、vt1 ... vt6はtty1 ... tty6に準拠する必要があることです。 (tty8 ... tty12/vt8 ... vt12は使用できなくなりました。)

従来の設定の使用を避け、コンソールへの切り替えを避けたい。 xinit xterm -- :1 vt8の可能性を取り戻したい。

特権のないユーザーがすでに実行中のX内から2番目のXサーバーを起動できるようにsystemdを設定するにはどうすればよいですか?

5
mviereck

xinitは脆弱であるため、使用しないことをお勧めします。代わりにstartxを使用してください。 xinitは、警告やドキュメントなしで、任意のユーザーIDからのX接続を受け入れるように記述されているようです。 startxはこれを修正しているようです。なぜこの状況が許容されるのか、そもそもどのように起こったのかはわかりません。

ルートとして:

systemd-run --property PAMName=login \
            --property User=my-user \
            --property StandardInput=tty \
            --property TTYPath=/dev/tty8 \
            sh -c 'chvt 8 && startx /usr/bin/xterm -- :1'

魔法は、PAMName=を定義して、PAMセッションを開き、そのセッションを特定のTTYに関連付けることです。これにより、 pam_systemd が必要な処理を実行します。私はloginを偽装しましたが、技術的には、特別な処理が必要な場合に備えて、新しいPAM「サービス名」を定義することになっています。

したがって、目的のコマンドを実行するスクリプトを作成できます。次に、Sudoを使用して、そのスクリプトをrootとして実行するためのアクセスを許可します。

SELinuxを使用している場合は、それと戦う必要があります。

3
sourcejedi