我可以使用' systemctl --user'来控制系统用户。在sudo su - myuser之后?

时间:2015-12-08 22:27:03

标签: linux sudo systemd

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

在root systemd中定义,这很好用,并启动和停止系统的服务。正如预期的那样,服务实例与systemctl enable ap@inst1一起安装。 Root也可以毫无问题地启动和停止服务。该服务在其自己的帐户(myuser)中运行,而不是root,由ap @ .service模板中的User = myuser控制。

但我想要用户' myuser'能够在不影响系统安全的情况下启动和停止自己的服务。

我切换到使用用户systemd,并启用loginctl enable-linger myuser延迟。然后,我启用~myuser / .config / systemd / user目录中定义的服务。现在,该服务按照设计与系统一起干净地启动和停止。如果我以' myuser',systemctl --user start ap@inst1systemctl --user stop ap@inst1登录终端,则两者都能正常运行。

但是,如果我以其他用户(user2)身份登录并在终端中执行sudo su - myuser,则systemctl --user命令现在失败并显示错误消息"无法获得D-Bus连接:没有这样的文件或目录"。

如何在systemctl --user命令切换用户后启用sudo su - myuser

1 个答案:

答案 0 :(得分:15)

我在其他网站上找到了答案,并使用不同的条款进行了进一步搜索。

所需的解决方案是为shell提供信息,以便为用户提供正确的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 - myusersudo -l myuser)才能创建正确的环境。

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