我当前正在使用 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 环境变量,以便您稍后轻松引用它。