我创建了一个生成一些.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或任何其他配置文件]
答案 0 :(得分:0)
Sudo通常需要交互式shell来输入您的密码。这显然不会发生在PHP脚本中。如果您确定自己知道自己在做什么并且已经解决了安全问题,请尝试允许Apache用户在没有密码的情况下运行sudo
,但仅针对某些命令。
例如,在sudoers文件中添加以下行将允许Apache在没有密码的情况下运行sudo
,仅用于gzip
命令。
nobody ALL=NOPASSWD: gzip
调整路径并添加任何参数以满足您的需求。
<强>注意:强>
另一种选择:
使用suid位编写一个shell脚本,使其无论是谁调用它都以root身份运行。
可能是更好的选择:
将命令写入队列并让cron接收它们,验证它们(仅允许已知的好请求)并运行它们,然后用日期和结果标记该队列。
然后,您的最终用户可以使用ajax单击/等待更新。
希望它有助于解决您的问题。