<?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来运行这个特定的虚拟主机。