Systemd - 查找要使用的 .Xauthority 文件

Systemd - 查找要使用的 .Xauthority 文件

我当前正在使用 systemd 单元文件来配置使用 X 服务器显示的服务。

X 服务器实例由登录的用户(当前pi用户)启动,但服务是在 root 下启动的。

systemctl start test_graphic_app如果我将 .Xauthority 文件位置硬编码到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}'

但是,如果该命令在我的笔记本电脑上运行,则在 pi 上不起作用

## 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 +

如何获取我的 systemd 单元内的位置?

除了查找 .Xauthority 位置之外,还有其他更好的解决方案吗?

答案1

有更复杂的版本xhost +,即xhost +si:localuser:root仅将本地用户 root 添加到允许的连接列表中。

您需要找到放置此命令的位置,以便它在登录时运行,具体取决于您的发行版。使用“already”查找/etc/X11/现有文件xhost。在我的 pi 上我发现它/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 脚本包装在这个 shell 脚本中:

#!/bin/sh

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

只需让您的 systemd 服务启动该脚本即可!

只需确保运行安装脚本时设置 XAUTHORITY 环境变量即可。您可以通过不使用 sudo 运行它或使用sudo -E.

基本上,这会存储运行安装脚本时的 XAUTHORITY 环境变量,以便您稍后轻松引用它。

相关内容