尝试重命名目录时,为什么我在PHP中获得“权限被拒绝”?

时间:2008-10-12 21:20:11

标签: php permissions rename

我将目录chmod到777,与目录内容相同。不过,我收到了“拒绝许可”的错误。如果apache不是组/所有者,无论文件权限如何,PHP都会抛出此错误吗?这是失败的电话:

rename('/correct/path/to/dir/1', '/correct/path/to/dir/2');

6 个答案:

答案 0 :(得分:11)

您正在编辑更高级别的目录,因此PHP用户需要具有该目录的写入权限。

答案 1 :(得分:2)

这可能是因为apache不是父目录的所有者。重命名(或移动)文件与创建新文件基本相同。

答案 2 :(得分:2)

澄清一下,php只能重命名它拥有实际所有权的目录:

-rwxrwxrwx user   user   temp/
-rwxr-xr-x apache apache temp2/
-rw-r--r-- user   user   script.php

假设script.php正在尝试重命名这两个目录:

// this operation fails as PHP (running as apache) does not own "temp",
// despite having write permissions    
rename('temp', 'temp.bak');

// this operation is successful as PHP owns "temp2"
rename('temp2, 'temp.bak'); 

答案 3 :(得分:0)

尝试运行以下脚本:

print_r(posix_getpwuid(getmyuid()));
print_r(pathinfo($YOUR_PATH));

看看会有什么回报。

答案 4 :(得分:0)

可能有助于这些情况的另一件事是尝试实际降低权限。我见过apache拒绝执行某些操作的权限,因为它的权限设置为 high 。我的猜测是,这是为了鼓励良好的安全实践。

答案 5 :(得分:0)

您必须递归更改文件夹及其所包含文件的权限。 您需要以root用户身份从ssh进行此操作,然后运行以下命令:

public string SearchDirectory(string dir, string fileName)
{
    string foundDir = "";
    bool fileFound = false;
    // Gets all files from directory and creates list of matches to fileName
    try
    {
        foreach (string match in Directory.GetFiles(dir, fileName))
        {
            // Returns the first found match as a path and breaks loop
            Console.WriteLine("Checked path: " + dir + ".");
            if (File.Exists(dir + @"\" + fileName))
            {
                Console.WriteLine("FOUND!!");
                fileFound = true;
                foundDir = dir;
                break;
            }
            if (fileFound == true)
            {
                break;
            }
        }
    }
    catch
    {
        Console.WriteLine("Access to path: " + dir + " denied.");
    }

    // If fileName isn't found in directory, it searches each new directory
    // The last directory it will check is the last one in the original directory
    if (fileFound == false)
    {
        try
        {
            foreach (string newDirectory in Directory.GetDirectories(dir))
            {
                Console.WriteLine("Checked path: " + dir + ".");
                SearchDirectory(newDirectory, fileName);
            }
        }
        catch
        {
            Console.WriteLine("Access to path: " + dir + " denied.");
        }
        // fileName does not exist in starting directory
    }
    else
    {
        return foundDir;
    }
    return "";
}

然后您就可以执行chown语句了。

研究,测试几个小时后,我才发现这种方式。

请记住,文件夹或root所有者文件不能被其他用户操纵(删除,重命名,移动,更改属性),而root可以在任何用户之上操作。

最诚挚的问候