我希望能够为给定的非 root 用户启动systemd
会话(例如systemd --user
),然后通过会话启动服务(例如systemctl --user start SERVICE.service
)sudo -iu USER
,但不在该调用loginctl enable-linger USER
之前使用。sudo
我知道如果我要ssh USER@host
,PAM 会很乐意systemd
为我创建/启动一个“会话”,但我既不想也不能使用ssh
。我也知道我可以使用loginctl enable-linger USER
,但我也不想这样做。
但是,如果用户已经登录,我想使用现有会话,而不是启动新会话。我想要的是这样的:
sudo -iu USER # or possibly sudo -su USER
# then in sudo subshell...
# setup pointers to correct DBUS session:
export XDG_RUNTIME_DIR="/run/user/$(id -u)"
export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"
# then start a systemd session, if not already running
loginctl show-user $(id -u) || systemd --user
不幸的是,systemd --user
命令出现错误,例如:
Failed to create /user.slice/user-NNN.slice/session-NNN.scope/init.scope control group: Permission denied
Failed to allocate manager object: Permission denied
我遗漏了什么?pam_systemd
当 headless/ssh
会话启动时,显然可以完成我想要的工作。我可能缺少一些基础知识,因此还需要指向相关文档的指针,尽管我认为我已经阅读了大多数相关手册页。
为了额外加分——就像pam_systemd
,如果一个会话尚未运行,而我们必须启动一个会话,那么当sudo
会话结束时,该会话应该自动关闭。