我在我的 Debian/Apache2.4 服务器上有一个用 Python 编写的 webhook 脚本,因此它在推送 GitHub 时运行部署 .sh 脚本。因此,该脚本由标准 Apache 用户“www-data”执行。我的脚本需要重新启动或重新加载 Apache,但输出显示用户没有这样做的权限:Reloading apache2 configuration (via systemctl): apache2.serviceFailed to reload apache2.service: Access denied
. 手动执行时的行为与 www-data ( sudo -u www-data /etc/init.d/apache2 reload
) 相同。
因此,我尝试通过在我的 visudo 中添加以下行来使“www-data”具有重新加载或重新启动 Apache 的权限:(www-data ALL = NOPASSWD: /etc/init.d/apache2
根据此文档)。
但这并没有改变任何东西。为什么?是因为 Apache 无法重新加载自己吗?我该如何更改权限呢?或者我是否需要其他用户执行脚本,以及如何执行?
由于 httpd 绑定到保留的端口 80 和 443,因此您需要 root 权限才能重新启动它们。这意味着用户
www-data
没有足够的权限这样做。因此,您需要做的是允许用户
www-data
以 root 身份运行此命令。您可以通过将此行添加到您的 sudo 配置(或添加到 中的单独文件/etc/sudoers.d
,如果您的系统使用它)来做到这一点:您的
www-data
用户现在将能够以 root 身份运行这个命令。您需要编辑脚本以使其包含而不仅仅是
您的系统可能配置为在使用 sudo 时需要 tty。这通常专门用于防止使用 sudo 的脚本,因为这是一种攻击媒介。如果是这种情况,您的 sudoers 文件需要稍微复杂一些:
这意味着只有命令
/etc/init.d/apache2 reload
可以在不需要 tty 的情况下运行。