如何授予 PHP 对目录的写入权限?

Posted

技术标签:

【中文标题】如何授予 PHP 对目录的写入权限?【英文标题】:How do I give PHP write access to a directory? 【发布时间】:2011-02-23 10:45:27 【问题描述】:

我正在尝试使用 php 创建一个文件,但它不起作用。我假设这是因为它没有写访问权限(以前一直是问题)。我试图通过将文件夹设置为 chmod 0777 来测试这是否是问题所在,但这最终导致该目录中的每个脚本都返回 500 错误消息,直到我将其更改回来。 如何授予 PHP 对我的文件系统的写入权限,以便它可以创建文件?

编辑:它使用 Apache 托管在 Hostgator 共享主机上。

编辑 2:有人要求提供代码: 该代码是一个 GD 图像脚本。我知道它的其余部分像以前一样工作,我每次调用它时都会创建图像。现在我正在尝试在添加新文本时创建它们并将它们保存到文件夹中。我的写行是: imagejpeg(null,$file,85);

我还创建了一个测试文件来检查它是否只是一个损坏的脚本(主要是从 tizag 复制的): http://gearboxshow.info/rkr/lesig.jpg/testfile.txt(我不知道是否/如何在此处正确发布代码。这是 PHP 脚本的内容,减去 PHP 标记。)

它返回 13,13,1(单独的行),所以它看起来好像它认为它写了一些东西,但是 testfile.txt 是空白的(我上传了一个空白的),或者不存在(如果我删除它)。

编辑 3:服务器运行 CentOS。

【问题讨论】:

这是您控制的服务器还是您在共享服务器上? Hostgator 共享主机。阿帕奇。 服务器运行在什么操作系统上?如果是 Linux,您应该确保 apache 用户(确切的用户名将取决于您的设置 - 在 Linux 下通常是 httpd 或 www-data)具有对该目录的写入权限。您可以将所有者更改为与 apache 相同的用户(使用 chown)并设置为所有者提供写入权限(例如“chmod 755”),或者您可以将其设为全局可写(例如“chmod 777”)。 @El Yobo:不要让它成为 777 ......请让我们对 chmod 保持理智。 【参考方案1】:

小小的提示!

回显whoami;

确保你使用反引号 不是 单引号'' !

(当然现在反引号不会出现在这个编辑器中!哦,我试过了!)

【讨论】:

【参考方案2】:

一个简单的方法是让 PHP 首先自己创建目录。

<?php
 $dir = 'myDir';

 // create new directory with 744 permissions if it does not exist yet
 // owner will be the user/group the PHP script is run under
 if ( !file_exists($dir) ) 
     mkdir ($dir, 0744);
 

 file_put_contents ($dir.'/test.txt', 'Hello File');

这为您省去了权限方面的麻烦。

【讨论】:

没错。您可以修改权限以满足您的需要。 这是最简单的解决方案,尽管您不应该在 apache 上使用 777,因为它被配置为阻止这些文件。 我在创建目录时被拒绝! 这假定您对要在其中创建 myDir 的文件夹具有写入权限【参考方案3】:

简单的三步解决方案

摘要:需要将目录的所有者设置为PHP使用的用户(web服务器用户)


第 1 步:确定 PHP 用户

创建一个包含以下内容的 PHP 文件:

<?php echo `whoami`; ?>

将其上传到您的网络服务器。输出应类似于以下内容:

www-data

因此,PHP 用户是www-data


第 2 步:确定目录所有者

接下来,通过命令行查看web目录的详细信息:

ls -dl /var/www/example.com/public_html/example-folder

结果应该类似于以下内容:

drwxrwxr-x 2 exampleuser1 exampleuser2 4096 Mar 29 16:34 example-folder

因此,目录的所有者是exampleuser1


第 3 步:将目录所有者更改为 PHP 用户

然后,将 web 目录的所有者更改为 PHP 用户:

sudo chown -R www-data /var/www/example.com/public_html/example-folder

验证 web 目录的所有者是否已更改:

ls -dl /var/www/example.com/public_html/example-folder

结果应该类似于以下内容:

drwxrwxr-x 2 www-data exampleuser2 4096 Mar 29 16:34 example-folder

因此,example-folder 的所有者已成功更改为 PHP 用户:www-data


完成! PHP 现在应该可以写入目录了。

【讨论】:

这里完全 OT,但没有其他方法可以 ping 您:感谢您在 Coffee SE 的辛勤标记工作! @Stephie 没问题! 非常好的分步手册,非常感谢!我会补充一点。我解决了将文件写入 vagrant 机器内的 vagrant 共享文件夹的问题,该机器使用您的手册​​运行 apache,但首先,我必须将 chmod -R 0777 设置为本地 PC(包含 vagrant 机器)上的共享文件夹。跨度> 这对我来说非常有效。无需更改即可让我的 PHP 脚本找到可写目录。 这很好用!这应该是公认的答案。【参考方案4】:

将目录的所有者设置为运行 apache 的用户。在 linux 上通常没有人

chown nobody:nobody <dirname>

这样你的文件夹就不会是全局可写的,但对于 apache 仍然是可写的 :)

【讨论】:

如果你使用 Ubuntu,这个用户和组不存在。有什么建议可以完成你在这里所做的事情吗? @BrandonMinton 'chown www-data:www-data ' 应该这样做。 www-data 是基于 debian 的系统上的 apache 用户 你好,你说需要chown nobody:nobody &lt;dirname&gt;我必须在哪里编码? @guitarlass 您需要将该命令放入 bash/ssh 窗口 有时我不明白为什么在权限方面工作或不工作,我很高兴这只是工作.....热狗。【参考方案5】:

我正在运行 Ubuntu,如上所述,nobody:nobody 不能在 Ubuntu 上运行。你得到错误:

chown: invalid group: 'nobody:nobody'

您应该使用“nogroup”,例如:

chown nobody:nogroup <dirname>

【讨论】:

【参考方案6】:

1st 使用以下命令找出哪个用户拥有 httpd 进程

ps aux | grep httpd

你会得到这样的多行响应:

phpuser   17121  0.0  0.2 414060  7928 ?        SN   03:49   0:00 /usr/sbin/httpd

这里的第一列显示用户名。所以现在你知道了正在尝试写入文件的用户,在这种情况下是phpuser 您现在可以继续为您的 php 脚本尝试写入内容的目录设置权限:

sudo chown phpuser:phpuser PhpCanWriteHere
sudo chmod 755 PhpCanWriteHere

【讨论】:

现在你必须使用ps aux | grep apache2【参考方案7】:

授予目录写入权限的最佳方式..

$dst = "path/to/directory";
mkdir($dst); 
chown($dst, "ownername");
chgrp($dst, "groupname");
exec ("find ".$dst." -type d -exec chmod 0777  +");

【讨论】:

【参考方案8】:

您可以将 selinux 设置为 permissive 以便分析。

    # setenforce 0

Selinux 将记录但允许访问。因此,您可以查看/var/log/audit/audit.log 了解详情。也许您需要更改 selinux 上下文。为此,您将使用chcon 命令。如果您需要,请告诉我们您的audit.log 以获得更详细的答案。

解决问题后不要忘记启用 selinux。最好保持 selinux 的强制执行。

    # setenforce 1

【讨论】:

【参考方案9】:

我遇到了同样的问题:

由于我不愿意将 0777 提供给我的 php 目录,我创建了一个权限为 0777 的 tmp 目录,我在其中创建了我需要写入的文件。

我的 php 目录继续受到保护。如果有人入侵了 tmp 目录,该站点将继续照常运行。

【讨论】:

【参考方案10】:

chmod 不允许您设置文件的所有权。要设置文件的所有权,您必须使用 chown 命令。

【讨论】:

【参考方案11】:

我发现使用 HostGator,您必须将文件设置为 CMOD 644,将文件夹设置为 755。由于我是根据他们的技术支持这样做的,因此它适用于 HostGator

【讨论】:

【参考方案12】:

您可以使用 PHP 的 chmod() 更改文件夹的权限。关于如何使用该命令的更多信息在这里:http://php.net/manual/en/function.chmod.php

如果您在将权限设置为 777(全局可写)时收到 500 错误,则表示您的服务器已设置为阻止执行此类文件。这样做是出于安全原因。在这种情况下,您需要使用 755 作为文件的最高权限。

如果在执行 PHP 文档的文件夹中生成了 error_log 文件,您将需要查看最后几个条目。这将使您了解脚本失败的地方。

为了获得有关 PHP 文件操作的帮助,我使用 http://www.tizag.com/phpT/filewrite.php 作为资源。

【讨论】:

文件夹当前已默认设置为 0755。我从没想过检查 error_log,但我只是做了,它没有包含任何关于它为什么无法生成文件的信息。 发布您遇到问题的代码可能是个好主意。我有时用于文件处理程序语法帮助的一个很好的资源是tizag.com/phpT/filewrite.php。

以上是关于如何授予 PHP 对目录的写入权限?的主要内容,如果未能解决你的问题,请参考以下文章

在 IIS 7 上添加对 PHP 的写入权限

如何在使用 .NET 安装期间授予对文件夹的读/写权限

如何在 IIS 中授予 Web api 应用程序写入权限?

如何在 Windows 8 上通过 C++ MFC 授予“所有人”写入权限?

如何允许 TTS 将文件写入我的应用程序目录?

如何授予在磁盘或映射驱动器上写入的权限