shell_exec 无法创建文件

shell_exec 无法创建文件

我正在使用 nginx 网络服务器,并且正在编写一个包含文件创建的脚本,但即使我在 sudoers 列表中授予权限,www-data 也无法创建该文件。

在我的 sudoers 文件中:

www-data ALL=(ALL) NOPASSWD: /usr/bin/php, /usr/bin/python

我什至尝试授予所有权限,但仍然无法通过浏览器创建文件。

www-数据 ALL=(ALL) NOPASSWD: ALL

我的简单脚本只想创建一个文件,它可以通过终端运行,但不能在浏览器上运行。

<?php
$data = "test";
shell_exec("sudo /bin/echo $data > /var/www/api/v3/monitoring/iam/temp");

答案1

如果您键入,sudo echo $data >file您的 shell 将首先以普通用户身份打开输出文件,然后sudo echo使用连接到已打开文件的输出运行。因此,该echo命令以 root 身份运行,但file以普通用户身份打开。

你需要一个像sudo sh -c 'echo $data >file'.

也许使用 . 授予用户对给定目录的写权限会更容易chmod

答案2

我认为关于以 root 身份运行 Web 服务器进程的警告是坏的应该考虑到想法。需要注意的是,要回答OP,对我来说,关键是将目录添加到 sudoers 文件中,以在其中生成文件。例如,如果要将文件写入目录/var/www/api/v3/monitoring/iam/temp,那么 sudoers 文件可能包含以下条目。

www-data ALL=ALL NOPASSWD:/var/www/api/v3/monitoring/iam/temp

在这种情况下,至少将授予 Web 服务器 root 权限的危险包含在一个目录中。而且我不需要在 exec 命令之前加上 sudo 。例如,php exec 将如下所示。

<?php
$data = "test";
shell_exec("echo $data > /var/www/api/v3/monitoring/iam/temp");

相关内容