我正在 Debian Bookworm 下构建一个服务器,主要用于阅读和保存旧磁带。概念是让盒子装满单元,但很少使用,当这种情况发生时,使用 Web 界面以避免使用键盘和屏幕。
Apache 和 PHP 已安装并正常运行。然而,exec
当我尝试执行systemctl reboot
和时,PHP 命令出现问题systemctl poweroff
,尽管我在 sudoers 文件中添加了以下行:
www-data ALL=NOPASSWD:/sbin/poweroff,/sbin/reboot
结果exec
总是出现“权限被拒绝”通知。我做错了吗?还是我遗漏了什么?如果是这样,我该如何解决这个问题?
提前非常感谢
这里混合了三种不同的概念。
首先,你添加了错误的命令:
systemctl reboot
不是/sbin/reboot
!尽管相似,但它是一个单独的/bin/systemctl
程序,只是恰好将单词“reboot”作为命令行参数。其次, /etc/sudoers仅影响 sudo。它不会以任何其他方式自动授予您权限 - 它所做的只是允许您
sudo systemctl this or that
在其他人的帐户下(并使用他们的权限)运行该命令。当在没有 sudo 的情况下运行该命令时,无论 /etc/sudoers 中有什么,它仍然具有与之前相同的原始权限。
运行不使用 sudo 的 systemctl 时,您可能会看到密码提示,该提示由polkit(以前称为 PolicyKit)显示。它是一个独立于 sudo 的系统,它以“操作”而不是命令的方式工作。与 sudo 不同,polkit 操作的权限由执行该操作的程序直接检查(输入密码时您不会成为 root;相反,polkit 有“允许”、“允许使用密码”和“允许使用管理员密码”三个不同的访问级别)。
因此,您需要在以下两个选项之间做出选择:
如果您想使用 sudo 和 /etc/sudoers,那么您的网页需要运行带前缀的命令
sudo
。如果您希望命令在没有 sudo 的情况下运行,那么您需要编写 polkit 规则而不是 sudoers 规则。
对于 polkit,您首先需要确定与“systemctl reboot”关联的 polkit 操作名称——无论何时运行该命令,它都会显示在您的日志(
journalctl -f
)中,它看起来像org.freedesktop.systemd.whatever
。之后,如果您拥有 polkit v106 或更高版本,规则将以 JavaScript 定义,如这些示例和 中所述
man 8 polkit
。例如: