bol*_*ino 1 linux permissions bash sudo apache-2.4
我在我的 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 ALL = (root) NOPASSWD: /etc/init.d/apache2 reload
Run Code Online (Sandbox Code Playgroud)
您的www-data
用户现在可以以 root 身份运行这个命令。您需要编辑脚本以使其包含
sudo /etc/init.d/apache2 reload
Run Code Online (Sandbox Code Playgroud)
而不仅仅是
/etc/init.d/apache2 reload.
Run Code Online (Sandbox Code Playgroud)
您的系统可能配置为在使用 sudo 时需要 tty。这样做通常是为了防止脚本使用 sudo,因为这是一种攻击媒介。如果是这种情况,您的 sudoers 文件需要稍微复杂一些:
Cmnd_Alias APACHERELOAD = /etc/init.d/apache2 reload
Defaults!APACHERELOAD !requiretty
www-data ALL = (root) NOPASSWD: APACHERELOAD
Run Code Online (Sandbox Code Playgroud)
这意味着只能/etc/init.d/apache2 reload
运行命令而不需要 tty。