我将目录chmod到777,与目录内容相同。不过,我收到了“拒绝许可”的错误。如果apache不是组/所有者,无论文件权限如何,PHP都会抛出此错误吗?这是失败的电话:
rename('/correct/path/to/dir/1', '/correct/path/to/dir/2');
答案 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可以在任何用户之上操作。
最诚挚的问候