Php

允許 PHP 以 root 權限執行特定的 bash 腳本

  • April 22, 2016

我有一個呼叫 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

以上只是返回一個空字元串(到$resultPHP 變數) - 我做錯了什麼?

謝謝!

編輯:#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 *

如果有人可以證實或反駁我對此的理解,將不勝感激

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