Systemd - 使用する.Xauthorityファイルを見つける

Systemd - 使用する.Xauthorityファイルを見つける

現在、Xサーバーを使用して公開されたサービスを構成するためにsystemdユニットファイルを使用しています。

Xサーバーインスタンスはログインしたユーザー(現在のpiユーザー)によって開始されますが、サービスはルートから開始されます。

systemctl start test_graphic_appXAUTHORITY.Xauthorityファイルの場所をユニットファイルの変数にハードコードすると、次のように正常にサービスを開始できます。

[Unit]
Description=Test Graphic App
After=multi-user.target

[Service]
Type=simple

User=root
Group=root

Environment="DISPLAY=:0"
Environment="XAUTHORITY=/home/pi/.Xauthority"

ExecStart=/usr/bin/python3 /usr/sbin/test_graphic_app.py

KillSignal=SIGINT
SuccessExitStatus=SIGINT

StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=test_graphic_app

Restart=on-failure

[Install]
WantedBy=default.target

しかし、他のユーザーとしてログインしたり、ラップトップでローカルで実行したりすると、Xを起動したユーザーではないため、明らかに機能しません。pi

システムから.Xauthorityファイルの場所を動的にインポートしたいと思います。


sudo xauth info | grep Authority | awk '{print $3}'私は次のように使用しようとしています

Environment="XAUTHORITY=$(/usr/bin/xauth info | grep Authority | awk '{print $3}')"

ExecStartPre=/bin/bash -c 'export XAUTHORITY=${XAUTHORITY}'

しかし、私のラップトップでコマンドを実行すると、Pyでは動作しません。

## On laptop ##
$ sudo xauth info | grep "Authority file" | awk '{print $3}'
/run/user/1000/gdm/Xauthority

## On pi ##
$ sudo xauth info | grep "Authority file" | awk '{print $3}'
xauth:  file /root/.Xauthority does not exist
/root/.Xauthority

Xサーバーインスタンスを起動したユーザーに基づいて.Xauthorityファイルの場所を取得する方法が見つかりません。また、どのユーザーもXディスプレイを使用して次のことを許可したくありません。xhost +

私のシステムデバイス内の場所をどのように知ることができますか?

.Xauthorityの場所を見つけることに加えて、より良い解決策はありますか?

答え1

許可された接続リストにローカルユーザールートのみを追加するxhost +より複雑なバージョンがあります。xhost +si:localuser:root

ディストリビューションに応じて、ログイン時に実行するためにこのコマンドを配置する場所を探す必要があります。/etc/X11/既存のファイルを見つけるには、「すでに」を使用してくださいxhost。私のパイで私はこれを見つけました/etc/X11/Xsession.d/35x11-common_xhost-local

if type xhost >/dev/null 2>&1; then
  xhost +si:localuser:$(id -un) || :
fi

他のシステムではあります/etc/X11/xinit/xinitrc.d/localuser.sh

答え2

インストールスクリプトに以下を追加します。

sudo mkdir /opt/xauthorityfix
sudo chmod 777 /opt/xauthorityfix
echo "#!/bin/sh" > /opt/xauthorityfix/setxauthority.sh
echo "export XAUTHORITY=$XAUTHORITY" >> /opt/xauthorityfix/setxauthority.sh
sudo chmod 755 /opt/xauthorityfix

次に、Pythonスクリプトをこのシェルスクリプトにラップします。

#!/bin/sh

source /opt/xauthorityfix/setxauthority.sh
/usr/bin/python3 /usr/sbin/test_graphic_app.py

システムサービスにスクリプトを起動するように依頼してください。

インストールスクリプトを実行するときにXAUTHORITY環境変数を設定したことを確認してください。 sudoやsudo -E

デフォルトでは、インストールスクリプトを実行するとXAUTHORITY環境変数が保存されるため、後で簡単に参照できます。

関連情報