我有一个 PHP 脚本,我试图在其中取消文件与目录的链接。此特定目录中的文件已使用 FTP 上传,所用帐户与运行 Apache 的帐户不同。
PHP 使用 mod_php 在服务器上运行,因此我假设 PHP 脚本以运行 Apache 的同一用户身份执行。可能正因为如此,取消链接失败。
我在 CentOS 上运行 Apache 2.2.3 和 PHP 5.1.6。其中大部分由 Plesk 8 管理。但我对 shell 有完全访问权限。
我尝试创建一个新组,将 FTP 用户和 Apache 用户放入其中。然后我将文件的 GID 更改为该新组,以便 PHP 能够取消链接文件。没有成功。
我读过有关 suPHP en suEXEC 之类的选项的文章,但我对这些产品的了解有限。
使用 PHP 脚本删除这些文件的最佳方法是什么?
答案1
当我需要在具有 mod_php 的系统上执行需要 root 权限的 PHP 操作时,我通常会编写一个小的辅助脚本来实际执行该任务。然后我使用system()
或者proc_open()
通过 sudo 调用脚本。您需要配置您的 apache 用户帐户,以便能够无需密码运行该特定脚本。
如果系统安装了 php 的 cli 版本,那么您可以用 PHP 编写辅助脚本,因为它听起来对您来说很熟悉。
/etc/sudoers
看起来像这样:
Cmnd_Alias PHPHELPER=/path/helper-script
www-data ALL=NOPASSWD: PHPHELPER
这样做的好处是,您可以编写一个非常紧凑且特定的辅助脚本,该脚本仅执行一项任务,并且可以添加大量良好的错误检查以防止出现不良情况。这最大限度地降低了系统受损的可能性。
答案2
如果您授予用户 apache 对文件所在目录的写权限,php/apache 将能够取消链接它们。
取消链接/删除文件的权限(通常)不受实际文件的所有权和权限的约束,而是由文件所在目录的权限/所有权约束。例外情况是,如果目录具有粘着位设置后,只有文件所有者或root可以删除文件。
答案3
虽然我没有喜欢作为一名潜在用户/管理员,我认为最好的解决方案(就安全性而言)是使用 php-cgi 结合 mpm_itk 模块来执行/运行 PHP 脚本/页面。mpm_itk 允许 apache 将权限授予特定用户帐户(因此可以删除您需要删除的文件)。问题是 mod_php 在这种情况下无法运行,您必须将 php 作为 CGI 运行。
这实际上是以合理方式运行 PHP 的唯一方法,其中 PHP 以特定用户而不是 apache 用户身份执行。而 mod_php 是简单的并且它运行得很好,像您提出的情况是一个问题,特别是在多用户和共享环境中。