在sudo su – myuser之后,我可以使用'systemctl –user'来控制用户systemd吗?

我有一个服务,我想从系统启动开始。 我已经为它创build了一个ap @ .service定义作为模板,因为可能有很多实例。

在rootd系统中定义,这个效果很好,并且启动和停止系统的服务。 服务实例与systemctl enable ap@inst1一起安装,如预期的那样。 Root也能够在没有问题的情况下启动和停止服务。 该服务在自己的帐户(myuser)中运行,而不是root,由ap @ .service模板中的User = myuser控制。

但是我希望用户“myuser”能够启动和停止自己的服务,而不会影响系统的安全性。

我切换到使用systemd的用户,并启用与loginctl enable-linger myuser 。 然后启用在〜myuser / .config / systemd / user目录中定义的服务。 服务现在按照devise启动和停止与系统清洁。 如果我以“myuser”身份loginterminal,则systemctl --user start ap@inst1systemctl --user stop ap@inst1都可以正常工作。

但是,如果以不同的用户(user2)login并在terminal中执行sudo su - myuser ,则systemctl --user命令现在会失败,并显示错误消息“无法获得D-Bus连接:无此类文件或目录”。

如何启用systemctl --usersudo su - myuser命令后切换用户?

我在另一个网站上找到了答案,并用不同的术语进一步搜索。

所需的解决方案是向外壳提供信息,以便为用户提供正确的DBUS。

通过在运行systemctl --user之前将以下环境变量添加到shell,DBUS问题被消除,并且systemctl正常运行。

 export XDG_RUNTIME_DIR="/run/user/$UID" export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus" 

为了确保在sudo shell中DBUS_SESSION_BUS_ADDRESS可用,我将环境变量添加到目标用户标识的〜/ .bash_profile中。 这要求创建一个登录shell( sudo su - myuser或者sudo -l myuser )来创建正确的环境。

或者,将环境变量的创建添加到〜/ .bashrc(或其他shell的等价物)。 然后将为所有的贝壳创造重新建立环境。