我有一个调用 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 中注释掉了。
答案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。