一个用户(或者可能是 root)可以控制另一个用户的用户级 systemd 服务吗?
我已经尝试过sudo -u <some user> systemctl --user restart <some service>
,但它抱怨 dbus: Failed to get D-Bus connection: Connection refused
。
答案1
当我通过 ssh 远程登录 gentoo box 时,我遇到了同样的问题。就我而言,这是因为缺少XDG_RUNTIME_DIR
和环境变量。DBUS_SESSION_BUS_ADDRESS
运行以下命令并重试:
export XDG_RUNTIME_DIR="/run/user/$UID"
export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"
如果这有帮助,您可以将这些命令放入 .bashrc 中。我想一定有一个比 .bashrc 更优雅的解决方案,但这取决于您的发行版。
编辑:
以 root 身份登录后,我成功地systemctl --user
以另一个用户身份运行su
,如下所示:
su -c 'XDG_RUNTIME_DIR="/run/user/$UID" DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus" systemctl --user status' username
或使用sudo
(注意,我必须明确地将相应的用户 UID (1000) 添加到路径“/run/user/”,但如果您从 bash 脚本运行它,则可以使用 $SUDO_UID 代替):
sudo -u username XDG_RUNTIME_DIR="/run/user/1000" DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus" systemctl --user status
答案2
系统248-M username@
(2021 年 3 月发布)引入了对指定另一个用户的语法的支持。
假设另一个用户名是测试用户服务是foobar.service,你现在可以运行
sudo systemctl -M testuser@ --user restart foobar.service
答案3
假设someuser
用途巴什作为他们的登录 shell,添加以下内容出口到~someuser/.bashrc
:
export XDG_RUNTIME_DIR="/run/user/$UID"
export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"
然后,具有root/的用户须藤权限可以someuser
通过用以下命令包装命令来与 systemd交互runuser
:
sudo runuser -l someuser -c "systemctl --user restart some-template@$some-service.service"
答案4
Failed to connect to bus: No such file or directory
在 Ubuntu 20.04 上运行以下命令时,我遇到了同样的错误 ( ):
systemctl --user mask tracker-store.service tracker-miner-fs.service tracker-miner-rss.service tracker-extract.service tracker-miner-apps.service tracker-writeback.service
问题是由于别名造成的:
alias systemctl='sudo systemctl'
它替换systemctl
为sudo systemctl
sudo 导致了错误。
环境变量:
export XDG_RUNTIME_DIR="/run/user/$UID"
export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"
没有使用,因为sudo
.
mkaito
写在上面的评论:
我猜 sudo 需要那些白名单,因为它默认清除环境。