Php 添加到sudoers.d的脚本不作为根执行
在xubuntu框中,我使用以下脚本让PHP创建用户拥有的目录:Php 添加到sudoers.d的脚本不作为根执行,php,linux,sudo,sudoers,Php,Linux,Sudo,Sudoers,在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); ?&g
<?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);
?>
我还将文件
chmod
ed设置为0440
。从浏览器访问mkdir.php时,var转储的输出为NULL
,未创建任何目录。我做错了什么?您的设置有点混乱
当您从浏览器访问此脚本时,apache将使用www数据用户启动它
Sudo没有被执行。不能让apache通过sudo调用脚本。
您必须将敏感脚本包装到sudo调用中
例如:
创建两个脚本。第一个将由apache调用,第二个将由第一个通过sudo调用
first.php:
<?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);
?>
这样apache将启动first.php,它将使用sudo启动second.php
您可以测试sudo设置在登录服务器时是否正常工作,切换到www数据(su-www-data)。并手动运行脚本
一些旁注:
- 检查错误日志可能会很有用。(tail/var/log/apache/error\u log或类似stg)
- 不要忘记验证您的输入,否则您的系统将容易受到攻击。此问题的详细信息和解决方案:
- 空值可以是正常值。详情:
This function can return NULL both when an error occurs or the program produces no output. It is not possible to detect execution
使用此功能失败。访问时应使用exec()
程序退出代码是必需的
您是否也添加了通过sudo运行mkdir和chown命令的权限?在我看来,您运行的PHP脚本似乎没有sudo,然后尝试运行包含sudo的命令。这不是它的工作原理,要么用sudo运行mkdir.php(然后它里面的sudo是多余的),要么授予www数据权限来运行mkdir/chown(在系统安全方面是个坏主意)。@SamiLaine我不清楚这里发生了什么。我的假设是使用web浏览器(在localhost上)访问脚本,导致Apache(www数据用户)调用PHP。所以脚本实际上是由www数据执行的。该用户通常无法创建我用
$path
指定的目录,但如果s/he(用户)发出sudo命令,它应该能够创建该目录,确实如此。为了使它能够在不被询问密码的情况下执行该命令,我们在执行该脚本时向sudoers添加了www数据。看起来它应该能工作,但它不能。@SamiLaine我可以看到这个方法与大多数使用PHP sudo的示例不同。在我检查过的示例中,访问的脚本是一个shell脚本,而不是PHP源代码。这就是问题所在吗?如果我们想使用一个shell脚本,我们是否能够像PHP源代码那样为它提供一个路径?www数据是否为mkdir和chmod设置了路径?@FuzzyTree,情况并非如此。shell_exec未被禁用,并在同一源代码(此处未包含)的其他行上成功执行。我们不应该使用shell_exec(“sudo php/var/www/path/to/second.php”。$path)代码>在第一个脚本中?是否不可能使第二个脚本成为shell脚本(.sh
),并且仍然向其传递路径
。可以通过php调用它。我加了“#”/usr/bin/php'到第一行,它应该告诉sudo通过php运行脚本。但是也可以创建一个shell脚本。(也许这更容易)我还没有测试过这个。测试并发现有效时,将标记为接受答案。
#!/usr/bin/php
<?php
shell_exec("sudo mkdir -p " . $argv[1]);
shell_exec("sudo chown -R majid:majid " . $argv[1]);
?>
www-data ALL=(ALL:ALL) NOPASSWD: /var/www/path/to/second.php
This function can return NULL both when an error occurs or the program produces no output. It is not possible to detect execution