Php
允許 PHP 以 root 權限執行特定的 bash 腳本
我有一個呼叫 bash 腳本的 php 腳本,如下所示:
<?php $result = exec('sudo /bin/bash /var/www/my_bash_script.sh /var/www/vhosts/testsite/htdocs/'); var_dump($result); ?>
這是的內容
my_bash_script.sh
:#!/bin/bash svn export --force --no-auth-cache --username myusername --password mypassword http://1.2.3.4/repos/path/to/repo/ $1 2>&1 find $1 -print0 -type d | xargs -0 -n 1 -0 chown -R -v root:root 2>&1 find $1'storage' -print0 -type d | xargs -0 -n 1 chown -R -v apache 2>&1 find $1'shared' -print0 -type d | xargs -0 -n 1 chown -R -v apache 2>&1
該腳本的目的是從我的 svn repo 導出並正確設置使用者權限。
PHP 以
apache
使用者身份執行。為了授予 PHP 執行此腳本的權限,我在 sudoers 中添加了以下行:
apache ALL=(ALL) NOPASSWD:ALL
現在顯然這給了 PHP 太多的權力,所以我想限制 PHP 只執行這個特定的 bash 腳本,但我似乎無法獲得正確的語法:
apache ALL=(ALL) NOPASSWD:/var/www/my_bash_script.sh
以上只是返回一個空字元串(到
$result
PHP 變數) - 我做錯了什麼?謝謝!
編輯:
#Defaults requiretty
- 我已經在 sudoers 中註釋掉了。
我可能錯了,但我相信 sudoers 還限制可以傳遞給命令/腳本的參數,而不僅僅是命令本身。
如果您嘗試在沒有參數的情況下執行 .sh ,它可能會起作用,例如
sudo /bin/bash /var/www/my_bash_script.sh
因此,要告訴 sudoers 允許使用任何參數(通過 apache)執行該腳本,您需要像這樣調整該行:
apache ALL=(ALL) NOPASSWD:/var/www/my_bash_script.sh *
萬用字元將允許 apache 使用任何參數執行該腳本。
您可能還需要 /bin/bash 在該行中,但我不確定
apache ALL=(ALL) NOPASSWD: /bin/bash /var/www/my_bash_script.sh *
如果有人可以證實或反駁我對此的理解,將不勝感激