Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 添加到sudoers.d的脚本不作为根执行_Php_Linux_Sudo_Sudoers - Fatal编程技术网

Php 添加到sudoers.d的脚本不作为根执行

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

在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);
?>

我还将文件
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