我有一个PHP脚本,我试图从一个目录中取消链接文件。 这个特定的目录中的文件已经被上传到一个不同的帐户下,而不是一个Apache正在运行。
PHP使用mod_php在服务器上运行,所以我假设PHP脚本是以Apache运行的同一个用户身份执行的。 可能是因为这个,解除链接失败。
我在CentOS上运行PHP5.1.6的Apache 2.2.3。 其中大部分是由Plesk 8pipe理的。我确实可以完全访问shell。
我试图创build一个新的组,我把FTP用户和Apache用户。 然后,我将文件的GID更改为新的组,以便PHP应该能够取消链接文件。 没有成功。
我已阅读suPHP en suEXEC等选项,但我对这些产品的了解有限。
什么是能够使用PHP脚本删除这些文件的最佳方法?
当我需要PHP的东西,需要具有mod_php的系统的root权限时,我通常会编写一个小的帮助程序脚本来实际执行任务。 然后我使用system()或proc_open()通过sudo调用脚本。 您将需要configuration您的apache用户帐户能够运行没有密码的特定脚本。
如果系统安装了cli版本的php,那么你可以用PHP写你的帮手脚本,因为它听起来像你所熟悉的。
/etc/sudoers看起来像这样:
Cmnd_Alias PHPHELPER=/path/helper-script www-data ALL=NOPASSWD: PHPHELPER
这样做的好处是你可以编写一个非常严格和特定的助手脚本,只执行一个任务,并且你可以添加很多好的错误检查来防止不良情况。 这最大限度地减less了系统妥协的可能性。
如果你授予用户apache作为文件所在目录的写权限运行,php / apache可以解除链接。
取消链接/删除文件的权限通常不受所有权和实际文件的许可限制,而取决于文件所在目录的权限/所有权。例外情况是,如果目录具有粘滞位设置,那么只有文件所有者或根可以删除文件。
虽然我不喜欢这听起来像一个潜在的用户/pipe理员的方式,我认为最好的解决scheme(就安全性而言)将是使用php-cgi执行/运行PHP脚本/页与mpm_itk模块。 mpm_itk允许apache将特权放入特定的用户帐户(因此可以删除需要删除的文件)。 问题是,在这种情况下,mod_php将不能运行,你必须运行php作为CGI。
这是真正的PHP运行在一个理智的pipe理器,PHP作为一个特定的用户而不是apache用户执行的唯一方法。 虽然mod_php很容易 ,而且工作得很好,但是类似于你所提出的情况是个问题,特别是在多用户和共享环境中。