无需 sudo 的服务功能

无需 sudo 的服务功能

我在 CentOS 上的服务配置为在其配置文件中的某个用户下运行/etc/systemd/system

[Service]
User=buildman

当我su作为 buildman 时,我可以运行:

systemctl status myservice.service

但如果我尝试执行startstop,它会提示我输入密码。

如果我做:

sudo systemctl status myservice.service

它不会提示我,因为我已经配置了visudo

%buildman ALL= NOPASSWD:  /bin/systemctl * myservice.service

但为什么服务不像状态那样停止和开始工作呢?我想让 buildman 能够在没有 sudo 或密码的情况下执行这些服务命令。

主要原因是我需要从 Jenkins 启用服务重新启动,并且我在从其容器运行 sudo 时遇到了问题,该容器抱怨我需要一个“TTY”来运行它。

答案1

start/stop和之间的区别status在于status不改变系统状态。

对系统范围状态或配置的任何修改都需要系统范围管理权限——因此需要 sudo。读取服务的“状态”是只读操作,因此通常不受保护。

值得注意的是,用户服务不需要sudo。例如

systemctl --user start bobsburgers

由 bob 发出时会成功,但只能由 bob 发出。 (root 将无法启动此服务,因为它不是 root 用户服务。)

因此,如果您在这里感兴趣的服务不会改变系统范围的状态,您可以将其安装为用户服务

systemctl --user enable bobsburgers

标准配置是将您的服务文件放在~/.config/systemd/user.只要服务本身不需要全局权限,您就可以开始使用。

答案2

status命令不需要超级用户权限,它也可以工作sudostart并且stop确实需要sudo.您可以避免输入密码但不指定 sudo。

相关内容