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

我有一个PHP脚本调用这样的bash脚本:

<?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回购做出口,并正确设置用户权限

PHP以apache用户身份运行。

为了授予PHP权限来运行这个脚本,我已经添加了下面这行:

 apache ALL=(ALL) NOPASSWD:ALL 

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

 apache ALL=(ALL) NOPASSWD:/var/www/my_bash_script.sh 

上面只是返回一个空string(到$result PHPvariables) – 我做错了什么?

谢谢!

编辑: – 我已经#Defaults requiretty sudoers #Defaults requiretty

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

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

您可以使用以下设置

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

创build简单的testing脚本

 # cat test.sh #!/bin/bash set -u echo "Param1: $1" 

做简单的testing

 $ 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作为替代scheme,你可以使用mpm-itk和apache来运行这个特定的虚拟主机。