删除使用错误所有权创建的目录

时间:2012-01-04 16:30:16

标签: php

我的脚本创建了一个目录。在我意识到我需要从{apache到我的用户名chown()目录以便我可以访问上传的文件之前,我运行了几次脚本。现在我似乎无法摆脱目录,所以我可以开始清理。

我认为我需要做的就是写一个PHP脚本来做,因为在脚本中我会'是'apache。我已经尝试了rmdirchown,但我一直在permission denied。我甚至尝试在浏览器中加载文件,而不是只在命令行加载php file.php,以防影响有效用户。

我还能尝试什么?


我已经意识到从命令行调用脚本会以我的用户名作为用户运行它而不是web服务器运行它的用户名(apache)所以我一直在调用脚本通过浏览器。我一直在尝试将其命名为我的用户名,以便我可以从命令行中删除它,而不是尝试编写一些递归rmdir函数。

<?php
   $target = "/some/absolute/file/path";
   chown($target, "myself");
?>

3 个答案:

答案 0 :(得分:2)

这是共享主机上的常见问题,无论如何有几种方法可以解决这个问题。

  • 当通过Web服务器执行时,PHP脚本仅作为“www-user执行。如果您从shell php script.php运行它们,它们将以您登录的用户身份执行 - 让我们称之为“shell-user”。
  • 通常,无特权的用户无法更改文件/目录的所有权。
  • 相反,如果您的www-usershell-user有一个共同的组(这取决于您的共享托管服务提供商政策),您只需chgrp所有文件/目录(递归)对于该组,更改440对文件的权限,770对目录的权限,您也可以将其作为shell-user进行操作。更好的方法是使用Posix ACL自动设置组/权限,但在共享主机上找到启用它并不常见。
  • 如果您很幸运,并且您的共享主机已经足够好,您可以sudowww-user,这样您也可以像该用户一样运行命令。如果没有,唯一的办法就是让它通过网络服务器运行php脚本。

如果您只想递归删除目录..

..你可以使用这样的函数(来自:https://gist.github.com/1407308):

/**
 * Delete a file or directory recursively.
 * @param string $path
 */
function rmtree($path) {
    if (is_dir($path)) {
        foreach (scandir($path) as $name) {
            if (in_array($name, array('.', '..'))) {
                continue;
            }
            $subpath = $path.DIRECTORY_SEPARATOR.$name;
            rmtree($subpath);
        }
        rmdir($path);
    }
    else {
        unlink($path);
    }
}

请注意,您无法更改来自非特权用户的dirs /文件的所有权,仅限组和权限。

答案 1 :(得分:1)

可能是该目录上的权限是只读的,或者目录中可能包含文件。

在命令行上,尝试:

ls -l directory

这将为您提供目录的权限和所有权。如果为所有者设置了'w'并且所有者是apache,则应该能够在由apache用户运行的脚本中使用rmdir(),除非有内容。所以chdir进入目录并查看是否有文件 - 目录中的任何文件都需要先删除。

希望这有帮助。

答案 2 :(得分:0)

如果从浏览器执行该文件会为您提供除用于登录的用户名以外的权限,那么您的大学将面临严重的安全漏洞。

要检查您是否可以这样做:

<?php echo `whoami`; ?>

另请发布(至少一段)ls -l,以便我们知道正在使用的用户名