不希望php脚本在通过浏览器执行时以apache用户身份执行shell命令吗?

时间:2013-08-22 13:11:08

标签: php apache shell unix webserver

我创建了一个生成一些.gz文件的PHP脚本,当我通过命令行(cli)执行PHP脚本时,它会生成.dz文件,其中'desert'作为用户,但是当脚本通过浏览器执行时使用'nobody'生成.gz文件作为用户不应该发生。当脚本通过浏览器执行时,我希望生成的文件具有'desert'用户而不是'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或任何其他配置文件]

1 个答案:

答案 0 :(得分:0)

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

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

nobody ALL=NOPASSWD: gzip

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

<强>注意:

  1. 由于PHP调用shell的方式,可能仍会出现并发症 命令。
  2. 请记住,允许Web服务器存在风险 以root身份运行命令!
  3. 另一种选择:

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

    可能是更好的选择:

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

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

    希望它有助于解决您的问题。