bbe*_*ord 4 php permissions bash sudo user-permissions
我有一个调用 bash 脚本的 php 脚本,如下所示:
<?php
$result = exec('sudo /bin/bash /var/www/my_bash_script.sh /var/www/vhosts/testsite/htdocs/');
var_dump($result);
?>
Run Code Online (Sandbox Code Playgroud)
这是内容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
Run Code Online (Sandbox Code Playgroud)
该脚本的目的是从我的 svn repo 导出并正确设置用户权限。
PHP 以apache
用户身份运行。
为了授予 PHP 运行此脚本的权限,我在 sudoers 中添加了以下行:
apache ALL=(ALL) NOPASSWD:ALL
Run Code Online (Sandbox Code Playgroud)
现在显然这给了 PHP 太多的权力,所以我想限制 PHP 只运行这个特定的 bash 脚本,但我似乎无法正确使用语法:
apache ALL=(ALL) NOPASSWD:/var/www/my_bash_script.sh
Run Code Online (Sandbox Code Playgroud)
以上只是返回一个空字符串(到$result
PHP 变量) - 我做错了什么?
谢谢!
编辑: - 我已经#Defaults requiretty
在 sudoers 中注释掉了。
我可能错了,但我相信 sudoers 还限制了可以传递给命令/脚本的参数,而不仅仅是命令本身。
如果您尝试在没有参数的情况下运行 .sh,它可能会起作用,例如
sudo /bin/bash /var/www/my_bash_script.sh
Run Code Online (Sandbox Code Playgroud)
因此,要告诉 sudoers 允许使用任何参数(通过 apache)运行该脚本,您需要像这样调整该行:
apache ALL=(ALL) NOPASSWD:/var/www/my_bash_script.sh *
Run Code Online (Sandbox Code Playgroud)
通配符将允许 apache 使用任何参数运行该脚本。
您可能还需要 /bin/bash 在该行中,但我不确定
apache ALL=(ALL) NOPASSWD: /bin/bash /var/www/my_bash_script.sh *
Run Code Online (Sandbox Code Playgroud)
如果有人能证实或反驳我对此的理解,将不胜感激
归档时间: |
|
查看次数: |
26190 次 |
最近记录: |