在xubuntu框中,我有以下脚本让PHP创建我的用户拥有的目录:
<?PHP
if(!isset($_REQUEST['path'])) die('No path specified');
$path = $_REQUEST['path'];
$res1 = shell_exec("sudo mkdir -p $path");
$res2 = shell_exec("sudo chown -R majid:majid $path");
var_dump($res1, $res2);
?>
该脚本位于/var/www/path/to/mkdir.PHP中
我还将此文件添加到/etc/sudoers.d/grantmkdir,其中包含以下内容:
www-data ALL=(ALL:ALL) nopASSWD: /var/www/path/to/mkdir.PHP
我已将文件chmoded到0440.从浏览器访问mkdir.PHP,var转储的输出为NULL NULL,并且不创建任何目录.我究竟做错了什么?
解决方法:
你的设置有点混乱.
当您从浏览器访问此脚本时,apache会使用www-data用户启动它.
Sudo没有被执行.你不能让apache通过sudo调用你的脚本.
您必须将敏感脚本包装到sudo调用中.
例如这样:
创建两个脚本.第一个将由apache调用,第二个将由第一个通过sudo调用.
<?PHP
if(!isset($_REQUEST['path'])) die('No path specified');
$path = $_REQUEST['path'];
// By the way here you should verify the path! Otherwise malicIoUs users can make your system execute whatever they want...
shell_exec("sudo /var/www/path/to/second.PHP " . $path);
?>
second.PHP
#!/usr/bin/PHP
<?PHP
shell_exec("sudo mkdir -p " . $argv[1]);
shell_exec("sudo chown -R majid:majid " . $argv[1]);
?>
并使second.PHP可以通过sudo执行:
/etc/sudoers.d/second
www-data ALL=(ALL:ALL) nopASSWD: /var/www/path/to/second.PHP
这样apache将启动first.PHP,它将使用sudo启动second.PHP.
您可以测试sudo设置是否正常工作,登录到您的服务器,切换到www-data(su www-data).并手动运行脚本.
一些附注:
>检查错误日志可能很有用. (tail / var / log / apache / error_log或stg类似)
>不要忘记验证您的输入,否则您的系统将容易受到攻击.此问题的详细信息和解决方案:http://php.net/escapeshellarg
> NULL NULL可以正常.详情:http://php.net/shell_exec
Note:
06003
failures using this function. exec() should be used when access to the
program exit code is required.