用户http没有写权限目录?

用户http没有写权限目录?

我认为我的设置有点奇怪。我为服务器托管的每个域都设置了组,并且我将用户 http 以及应该有权访问这些组的域的用户添加到每个域组。在从目录“public_html”运行的 php 脚本中,我尝试创建一个文件:

<?php
$output = "";
print exec('touch test 2>&1', $output);

但我明白

touch: cannot touch `test': Permission denied

并且文件未创建。但这里明确指出,该组对该目录拥有所有权限:

drwxrwxr-x 5 dwieeb example.com 1024 Feb  4 05:19 public_html

以下是尝试使用 exec 函数的 public_html 中的 php 文件的权限:

-rw-rw-r-- 1 dwieeb example.com   59 Feb  4 05:19 test.php

如果 http 是 example.com 组的一部分(从 /etc/group 上的 cat 看到)并且该目录具有该组的完全权限,那么这怎么可能呢?...

example.com:x:1000:dwieeb,http

我困惑了。

编辑(显然我还不够冷静,无法回答我自己的问题):

啊,我发现问题了。是的,我重启了 Nginx,但是当 http 添加到我的域的组中时,php-fpm 守护进程也必须重启。

在 Arch Linux 上:

rc.d restart php-fpm

答案1

有多种可能性,按概率大致排序:

  • 您可能没有重新启动 Web 服务器,因此它没有接收到群组变更;
  • Web 服务器用户上的组太多(用户可以加入的组数量有静态限制)
  • 该操作可能存在 ACL 或 selinux 限制。

出于这些和其他许多原因,不要让您的网络服务器运行动态代码。至少,使用 suPHP(或 suexec,一般情况下)以相关用户身份运行您的动态代码。在后台运行真正的应用服务器对性能更有利。

答案2

重新启动 php 守护进程:

rc.d restart php-fpm

(这样你就可以结案了)

答案3

通常你不希望 http 用户能够写入或执行任何内容。在某些环境中,这是一个巨大的安全问题。

不过,我也曾有过需要能够写入 public_html 结构中的特定目录的 php 代码。文件系统 ACL 可以轻松实现这一点。请查看 setfacl 命令。 https://linux.die.net/man/1/setfacl

您可以在您的环境中使用类似的东西(但要根据您的需要进行调整)#setfacl -Rm u:httpd:rw /var/httpd/public_html/upload 对于许多基于 LAMP 的 CMS,它需要一个目录来允许用户上传内容或类似内容。这是我过去所做的,允许运行 Web 服务器的用户写入该目录。您还可以使用文件系统 ACL 授予特定用户和/或组对特定目录的额外权限。例如,授予开发人员的用户帐户对 public_html 的访问权限,或授予开发人员组访问权限。

当您需要对用户和文件/目录权限进行比 chmod 或 chgrp 所能提供的更细粒度的控制时,它是非常漂亮的功能。

相关内容