我想创建一个 systemd 服务,reboot --force
每当 GPU 从总线上掉下来时,它就会启动我的系统。我为此目的编写了一个专用脚本 ( /home/heinwol/.local/bin/reboot_after_gpu_breaks.sh
)。但是,我不太明白用户和权限在 Linux 中是如何工作的,因此我的解决方案不起作用。
首先,我将以下行附加到 sudoers 文件中:
ALL ALL=(ALL:ALL) NOPASSWD:/home/heinwol/.local/bin/reboot_after_gpu_breaks.sh
该脚本的所有权和权限如下所示:
$ ls -l reboot_after_gpu_breaks.sh
-rwsr-xr-x 1 root root 384 окт 10 14:57 reboot_after_gpu_breaks.sh
它的工作原理是我可以简单地以普通用户身份运行它,而无需 sudo。但是,我无法使其与 systemd 一起使用。
更准确地说,我有以下内容用户服务:
[Unit]
Description=Reboot the system when gpu falls off the bus
[Service]
Type=simple
User=heinwol
Group=heinwol
StandardOutput=journal
ExecStart="/home/heinwol/.local/bin/reboot_after_gpu_breaks.sh"
[Install]
WantedBy=default.target
当我启用此服务时,它会大喊:
окт 10 15:28:02 heinwol-lenovo systemd[1322]: Started Reboot the system when gpu falls off the bus.
окт 10 15:28:02 heinwol-lenovo systemd[3287]: reboot_after_gpu_breaks.service: Failed to determine supplementary groups: Operation not permitted
окт 10 15:28:02 heinwol-lenovo systemd[3287]: reboot_after_gpu_breaks.service: Failed at step GROUP spawning /home/heinwol/.local/bin/reboot_after_gpu_breaks.sh: Operation not permitted
окт 10 15:28:02 heinwol-lenovo systemd[1322]: reboot_after_gpu_breaks.service: Main process exited, code=exited, status=216/GROUP
окт 10 15:28:02 heinwol-lenovo systemd[1322]: reboot_after_gpu_breaks.service: Failed with result 'exit-code'.
我究竟做错了什么?
答案1
实际上发生的是 systemd 的一项安全功能,旨在防止您在服务中使用 setuid。如果您将 NoNewPrivileges=false 添加到服务文件中,它应该可以正常工作。
但是,我不建议您使用 setuid,因为它是一个主要的安全缺陷。
你不能把你的服务放在 root 下吗?
它有助于避免安全缺陷,即使您需要以用户身份在脚本中运行某些内容,最好在以 root 身份运行的服务中切换用户来执行这些任务,而不是使用 setuid。在这种情况下,您甚至可以删除 sudo 规则。