我的 Debian/Apache2.4 服务器上有一个用 Python 编写的 webhook 脚本,因此它在 GitHub 上推送时会运行一个 deploy .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 无法自行重新加载吗?我该如何更改权限才能这样做?或者我需要让另一个用户执行该脚本,以及如何执行?
答案1
由于 httpd 绑定到保留的端口 80 和 443,因此您需要 root 权限才能重新启动它们。这意味着用户www-data
没有足够的权限来执行此操作。
因此,您需要做的是允许用户www-data
以 root 身份运行此命令。您可以通过将此行添加到您的 sudo 配置(或添加到 中的单独文件/etc/sudoers.d
,如果您的系统使用该文件)来实现此目的:
www-data ALL = (root) NOPASSWD: /etc/init.d/apache2 reload
您的www-data
用户现在将能够以 root 身份运行此单个命令。您需要编辑脚本,使其包含
sudo /etc/init.d/apache2 reload
而不仅仅是
/etc/init.d/apache2 reload.
您的系统可能配置为在使用 sudo 时需要 tty。这通常是为了防止脚本使用 sudo,因为这是一个攻击媒介。如果是这种情况,您的 sudoers 文件需要稍微复杂一些:
Cmnd_Alias APACHERELOAD = /etc/init.d/apache2 reload
Defaults!APACHERELOAD !requiretty
www-data ALL = (root) NOPASSWD: APACHERELOAD
这意味着只能运行命令/etc/init.d/apache2 reload
而不需要 tty。