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

允许 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

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

谢谢!

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

答案1

我可能错了,但我相信 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 *

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

答案2

您可以使用以下设置

Cmnd_Alias SVNUP = /root/webhooks/svn_update.sh
apache ALL=(ALL) NOPASSWD: SVNUP

创建简单的测试脚本

# cat test.sh
#!/bin/bash

set -u
echo "Param1: $1"

进行简单测试

$ id alex
uid=506(alex) gid=506(alex) groups=506(alex)

$ cat /root/webhooks/test.sh
cat: /root/webhooks/test.sh: Permission denied

$ sudo /root/webhooks/test.sh val1
Param1: val1

$ sudo /root/webhooks/test.sh
/root/webhooks/test.sh: line 5: $1: unbound variable

但由于变量扩展,你必须非常小心,例如

$ sudo /root/webhooks/test.sh "$(rm -fr ~/*)"

PS 另外,您可以将 mpm-itk 与 apache 一起使用,并以特定用户身份运行此特定的 vhosts。

相关内容