Linux
文件執行腳本中的visudo權限
我正在嘗試通過 php 執行 shell 腳本,但出現權限錯誤,但是我正在嘗試向我的 www-data 使用者添加權限,以便在沒有密碼的情況下使用 sudo 命令,但它不起作用,我沒有不知道我是否報告了任何錯誤。以下是我的“visudo”文件的編輯方式。
www-data ALL=(ALL) NOPASSWD:/var/www/mysite/classes/builder-sites-nginx.sh www-data ALL=(ALL) NOPASSWD:/var/www/mysite/classes/MyClassToCallScript.php
我的程式碼 PHP 是:
$command = "sudo sh ".dirname(__FILE__)."/builder-sites-nginx.sh {$domain}"; // dump($command); $response = shell_exec($command);
我的程式碼外殼:
#!/bin/bash FILE_FROM=/etc/nginx/sites-available/sites-builders FILE_TO=/etc/nginx/sites-enabled/"$1" [ ! -d "$FILE_FROM" ] && mkdir -p "$FILE_FROM" if test -f "$FILE_TO"; then echo "syntax is ok. $FILE_TO already exists" else ln -s "$FILE_FROM/$1" /etc/nginx/sites-enabled/ #check stats if nginx -t > /dev/null 2>&1; then echo "syntax is ok" service nginx reload else echo "syntax is not ok" rm "$FILE_TO" fi fi
但我的回答是“空的”。我通過將以下摘錄添加到我的“visudo”中進行了測試
www-data ALL=(ALL) NOPASSWD:ALL
使用我上面提到的方法是可行的,但我相信我的網站的安全性會受到威脅,對嗎?為什麼我的 apache 使用者將具有 sudo 權限,如果有人放入一些惡意文件我會遇到麻煩,所以我回到我最初的問題,我在執行給定腳本時放置“visudo”路徑的方式是正確的?
您沒有執行
sudo /var/www/mysite/classes/builder-sites-nginx.sh
,您正在執行sudo sh /var/www/mysite/classes/builder-sites-nginx.sh
- 並且sudo
未配置為允許 www-data 執行sudo sh
(也不應該 - 這將是一個巨大的安全漏洞,相當於www-data ALL=(ALL) NOPASSWD:ALL
)。使
/var/www/mysite/classes/builder-sites-nginx.sh
執行檔chmod +x
,並確保它#!/bin/bash
作為第一行(#!/bin/sh
也可以工作,因為您的腳本不使用任何 bash-only 功能)。然後將您的 PHP 程式碼修改為:
$command = "sudo ".dirname(__FILE__)."/builder-sites-nginx.sh {$domain}";
順便說一句,根據
$domain
定義的位置和方式(即,如果它來自使用者提供的數據),您可能需要使用 PHP 的escapeshellcmd()
函式對其進行清理。