我有一个调用 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 ,它可能会起作用,例如
因此,要告诉 sudoers 允许使用任何参数(通过 apache)运行该脚本,您需要像这样调整该行:
通配符将允许 apache 使用任何参数运行该脚本。
您可能还需要 /bin/bash 在该行中,但我不确定
如果有人可以证实或反驳我对此的理解,将不胜感激
您可以使用以下设置
创建简单的测试脚本
做简单的测试
但是由于变量扩展,您必须非常小心,例如
PS 作为替代方案,您可以将 mpm-itk 与 apache 一起使用,并以特定用户运行此特定虚拟主机。