Linux

以“www-data”使用者身份重新啟動或重新載入 Apache

  • July 4, 2018

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

您的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 的情況下執行。

引用自:https://serverfault.com/questions/919136