2

我创建了一个生成一些 .gz 文件的 PHP 脚本,当我通过命令行 (cli) 执行 PHP 脚本时,它会生成具有“沙漠”作为用户的 .gz 文件,但是当通过浏览器执行脚本时,它会生成 .gz 文件。 gz 文件以“nobody”作为用户,这不应该发生。当脚本通过浏览器执行时,我希望生成的文件具有“沙漠”用户而不是“无人”用户。

这是我创建的代码:

$file='test';
$newFileGZipCommand = 'cat '.$file.'_new | gzip > '.$file.'.gz';
//$newFileGZipCommand = 'sudo -u desert cat '.$file.'_new | gzip > '.$file.'.gz'; // This does not work
$newFileGZipCommandExecute = shell_exec($newFileGZipCommand);
//chmod($file.'.gz',0777) or die("Unable to change file permission");
//chown($file.'.gz', 'directu') or die("Unable to change file Owner");

我尝试通过 php 中的 chmod() 和 chown() 函数更改文件权限和所有者,但它说“chown():不允许操作”。

任何指向此的指针都受到高度赞赏。

[注意:我无法更改 httpd.conf 或任何其他配置文件]

4

1 回答 1

0

Sudo 通常需要一个交互式 shell 来输入您的密码。这显然不会在 PHP 脚本中发生。如果您确定自己知道自己在做什么并且已经解决了安全问题,请尝试允许 Apache 用户在sudo没有密码的情况下运行,但仅限于某些命令。

例如,在 sudoers 文件中添加以下行将允许 Apache 在sudo没有密码的情况下运行,仅适用于gzip命令。

nobody ALL=NOPASSWD: gzip

调整路径并添加任何参数以满足您的需要。

警告:

  1. 由于 PHP 调用 shell 命令的方式,可能仍然存在复杂性。
  2. 请记住,允许 Web 服务器以 root 身份运行命令是非常危险的!

另一种选择:

编写一个带有 suid 位的 shell 脚本,使其以 root 身份运行,无论谁调用它。

可能是更好的选择:

将命令写入队列并让 cron 提取它们、验证它们(仅允许已知的良好请求)并运行它们,然后用日期和结果标记该队列完成。

然后,您的最终用户可以单击/等待使用 ajax 进行更新。

希望它有助于解决您的答案。

于 2013-08-22T16:58:37.133 回答