以“www-data”用户身份重启或重新加载 Apache

以“www-data”用户身份重启或重新加载 Apache

我的 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。

相关内容