会话登录或用户更改后运行脚本,受限用户无法管理

会话登录或用户更改后运行脚本,受限用户无法管理

我想执行一个类似于“启动应用程序”的脚本,因为正式记录, 和在这个很好的答案中解释在这个问题中再次被问到

但是我还有其他非常具体的要求

  • 不应允许受限用户更改对脚本的调用
  • 该脚本应在会话登录后运行(最好在该用户的上下文中),并且刚刚登录的用户名必须对脚本可用
  • 如果用户发生变化,脚本也应该运行(Ubuntu 允许更改用户而无需退出第一个用户)

这将呈现 upstart(据我所知,它在系统启动时运行)和标准启动应用程序,因为即使受限用户也可以管理它们。

答案1

我认为您正在寻找的是用户的 systemd。

您可以在用户目录中添加 .service 文件:

~ve/.config/systemd/user/default.target.wants/

调用该文件<something>.service

# Documentation available at:
# https://www.freedesktop.org/software/systemd/man/systemd.service.html

[Unit]
Description=This User Service
After=foo.service

[Service]
Type=simple
WorkingDirectory=~
Environment="DISPLAY=:0"
ExecStart=/usr/bin/script
ExecStop=/bin/kill "$MAINPID"
Restart=on-failure
RestartSec=5

[Install]
WantedBy=default.target

显然,您需要调整参数以满足您的需求。这将ExecStart=...使用您需要的任何脚本或二进制文件启动定义的进程。该进程在用户登录时启动。X11 将运行。GDM 可能未 100% 启动。但是,您可以开始打开窗口,并且它会按预期工作。

ExecStop=...如果您在用户之间切换,该过程将继续运行。当用户注销时,它将停止。

如果您想运行一次脚本,您需要更改类型Type=once并删除Restart=...变量。

如果您正在创建 Debian 包,您实际上想要将该<something>.service文件安装在以下位置:

/usr/lib/systemd/user/...

然后您需要为该用户启用该服务。

干净的方法是使用该systemctl工具设置守护进程,如下所示:

systemctl --user deamon-reload
systemctl --user unmask '<something>.service'
systemctl --user enable '<something>.service'

然而,这只有当用户自己可以运行所述命令时才有效。

你的软件包必须安装它手动否则。以 root 身份运行时,以下内容有效:

mkdir -p /home/${USER}/.config/systemd/user/default.target.wants
chown -R ${USER}:${USER} /home/${USER}/.config/systemd
rm -f /home/${USER}/.config/systemd/user/default.target.wants/<something>.service
sudo -H -u ${USER} sh -c "ln -s /usr/lib/systemd/user/<something>.service /home/${USER}/.config/systemd/user/default.target.wants/<something>.service"

最后一行sudo是以用户身份创建软链接${USER}

相关内容