允许 PHP 使用 root 权限运行特定的 bash 脚本

bbe*_*ord 4 php permissions bash sudo user-permissions

我有一个调用 bash 脚本的 php 脚本,如下所示:

<?php
    $result = exec('sudo /bin/bash /var/www/my_bash_script.sh /var/www/vhosts/testsite/htdocs/');
    var_dump($result);
?>
Run Code Online (Sandbox Code Playgroud)

这是内容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
Run Code Online (Sandbox Code Playgroud)

该脚本的目的是从我的 svn repo 导出并正确设置用户权限。

PHP 以apache用户身份运行。

为了授予 PHP 运行此脚本的权限,我在 sudoers 中添加了以下行:

apache ALL=(ALL) NOPASSWD:ALL
Run Code Online (Sandbox Code Playgroud)

现在显然这给了 PHP 太多的权力,所以我想限制 PHP 只运行这个特定的 bash 脚本,但我似乎无法正确使用语法:

apache ALL=(ALL) NOPASSWD:/var/www/my_bash_script.sh
Run Code Online (Sandbox Code Playgroud)

以上只是返回一个空字符串(到$resultPHP 变量) - 我做错了什么?

谢谢!

编辑: - 我已经#Defaults requiretty在 sudoers 中注释掉了。

Had*_*adz 6

我可能错了,但我相信 sudoers 还限制了可以传递给命令/脚本的参数,而不仅仅是命令本身。

如果您尝试在没有参数的情况下运行 .sh,它可能会起作用,例如

  sudo /bin/bash /var/www/my_bash_script.sh
Run Code Online (Sandbox Code Playgroud)

因此,要告诉 sudoers 允许使用任何参数(通过 apache)运行该脚本,您需要像这样调整该行:

  apache ALL=(ALL) NOPASSWD:/var/www/my_bash_script.sh *
Run Code Online (Sandbox Code Playgroud)

通配符将允许 apache 使用任何参数运行该脚本。

您可能还需要 /bin/bash 在该行中,但我不确定

  apache ALL=(ALL) NOPASSWD: /bin/bash /var/www/my_bash_script.sh *
Run Code Online (Sandbox Code Playgroud)

如果有人能证实或反驳我对此的理解,将不胜感激