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


74

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

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

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

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

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

编辑3:服务器运行CentOS。


这是您控制的服务器,还是您在共享服务器上?
webbiedave 2010年

Hostgator共享托管。阿帕奇
Leagsaidh Gordon

服务器在什么操作系统上运行?如果是Linux,则应确保apache用户(确切的用户名取决于您的设置-在Linux下通常为httpd或www-data)具有对该目录的写权限。您可以将所有者更改为与apache相同的用户(使用chown)并设置为所有者授予写访问权限(例如“ chmod 755”),也可以使其变为可写(例如“ chmod 777”)。
El Yobo

11
@El Yobo:不要把它变成777 ...请让我们对chmod明智。
Jan K.

Answers:


62

一种简单的方法是让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');

这样可以节省您的权限麻烦。


2
那就对了。您可以修改权限以满足您的需求。
favo 2010年

6
这是最简单的解决方案,尽管您不应在apache上使用777,因为它已配置为阻止theose文件。
vdbuilder 2011年

7
制作目录时,我被拒绝了权限!
maxisme

这假设您具有对要在其中创建myDir的文件夹的写访问权
Randhir Rawatlal

34

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

chown nobody:nobody <dirname>

这样,您的文件夹将不会在世界范围内写入,但对于Apache仍然可以写入:)


5
如果使用Ubuntu,则该用户和组不存在。有什么建议可以完成您在这里所做的事情吗?
布兰登·敏顿

17
@BrandonMinton'chown www-data:www-data <dirname>'应该做到这一点。www-data是基于debian的系统上的apache用户
Thomas Winsnes

您好,您说过需要在chown nobody:nobody <dirname>哪里编写此代码?
guitarlass'5

@guitarlass你将需要把该命令到一个bash / SSH窗口
托马斯Winsnes

1
有时我不知道为什么权限时事情会起作用或不起作用,我很高兴这只是起作用... hot diggity dog。
n0nag0n 2014年

18

简单的三步解决方案

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


步骤1:确定PHP用户

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

<?php echo `whoami`; ?>

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

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现在应该能够写入该目录。


2
这里完全是OT,但没有其他方法可以对您执行ping操作:感谢您在Coffee SE上的辛勤标记工作!
Stephie '18

@Stephie没问题!
格兰特·米勒

很好的分步手册,非常感谢!我会补充一点。我通过将文件写入流浪者机器内部的流浪者共享文件夹来解决问题,该文件使用您的手册​​运行apache,但是,首先,我必须将chmod -R 0777设置为本地PC(包含流浪者机器)上的共享文件夹。
瓦哈

10

1使用以下命令找出哪个用户拥有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
Polluks

4

您可以使用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,但是我只是做了,它不包含任何关于为什么无法生成文件的信息。
Leagsaidh Gordon

发布您遇到问题的代码可能是一个好主意。我偶尔用于文件处理程序语法帮助的一个不错的资源是tizag.com/phpT/filewrite.php
瑞安·吉雷

3

我发现使用HostGator必须将文件设置为CMOD 644,将文件夹设置为755。由于我是基于他们的技术支持而完成的,因此它可以与HostGator一起使用


3

我有同样的问题:

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

我的php目录继续受到保护。如果有人破解了tmp目录,则该站点将继续照常工作。


3

您可以将selinux设置为宽松,以便进行分析。

    # setenforce 0

Selinux将登录,但允许访问。因此,您可以查看的/var/log/audit/audit.log详细信息。也许您需要更改selinux上下文。为此,您将使用chcon命令。如果需要,请向我们显示audit.log更详细的答案。

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

    # setenforce 1

3

授予目录写访问权限的最佳方法。

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

2

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


2

我正在运行Ubuntu,如上所述,没有人:没人不能在Ubuntu上工作。您得到错误:

chown: invalid group: 'nobody:nobody'

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

chown nobody:nogroup <dirname>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.