【问题标题】:PHP mkdir and apache ownershipPHP mkdir 和 apache 所有权
【发布时间】:2011-02-03 09:11:34
【问题描述】:

有没有办法设置 php 在 apache 下运行以创建文件夹,该文件夹由创建它的程序所有者拥有,而不是由 apache 拥有?

使用 word press 它会创建要上传到的新文件夹,但这些文件夹归 apache.apache 所有,而不归它们运行的​​站点所有。使用 ostickets 也会发生这种情况。现在我们必须通过 SSH 连接到服务器并 chmod 文件夹,但似乎在某处有一个设置可以覆盖任何执行此操作的程序之外的所有权。

【问题讨论】:

    标签: php apache mkdir owner chown


    【解决方案1】:

    Safe_mode 已在您的服务器上打开。函数mkdir() 使用与当前脚本所有者不同的所有者(“apache”、“none”、..)创建文件夹。并且脚本无法将文件上传(移动、复制)到另一个所有者(与当前脚本所有者不同)的文件夹中。

    禁用safe_mode 这样就可以了。

    详情请参阅http://php.net/manual/en/features.safe-mode.php

    附:启用 safe_mode 后,您不能在 php 中使用 chmod() 函数。

    【讨论】:

    • 警告 此功能自 PHP 5.3.0 起已弃用,自 PHP 5.4.0 起已移除。
    【解决方案2】:

    另一种方法是将 apache 用户和“客户用户”放在一个新组中。另外,该目录应使用粘性位SGID,以便每个新文件都将组分配给这个新组。这样网络服务器和“客户用户”就可以毫无问题地处理文件

    [17:57] progman@proglap /tmp/test $ ls -al /tmp/test
    total 9
    drwxrwsr-x  2 root users   48 Apr  1 17:55 .
    drwxrwxrwt 36 root root  9264 Apr  1 17:53 ..
    

    如您所见,该目录得到了SGID 的标记,所有者是我 (progman) 所在的“用户”组。否,如果其他用户添加文件,则该组会自动设置为该组

    [17:55] proglap ~ # touch /tmp/test/x
    

    这是从根目录执行的。现在我们得到:

    [17:57] progman@proglap /tmp/test $ ls -la /tmp/test
    total 9
    drwxrwsr-x  2 root users   72 Apr  1 17:59 .
    drwxrwxrwt 36 root root  9264 Apr  1 17:53 ..
    -rw-r--r--  1 root users    0 Apr  1 17:59 x
    

    如您所见,添加的文件来自根目录,但组设置为users,这样可以将其删除

    [18:00] progman@proglap /tmp/test $ rm x
    rm: remove write-protected regular empty file `x'? y
    [18:01] progman@proglap /tmp/test $ ls -la /tmp/test
    total 9
    drwxrwsr-x  2 root users   48 Apr  1 18:01 .
    drwxrwxrwt 36 root root  9264 Apr  1 17:53 ..
    

    请记住,如果您想编辑文件,您仍然需要更改chmod,因为rw-r--r-- 只是组读取权限。但是更改chmod,甚至可能使用umask,比处理root 访问和使用chown 更好。

    【讨论】:

      【解决方案3】:

      不直接,不。除非您是 root,否则您不能将文件的所有权“放弃”给其他用户。您可以使用“AssignUserID”apache 指令进行调查,以强制该特定虚拟主机作为特定用户/组运行。使用该 Apache/PHP 将创建具有适当所有权的任何文件

      【讨论】:

      • 以防万一其他人认为这可能是可行的方法(使用 mpm_perchild_module) - 我确实认为:来自链接:此模块不起作用。此模块的开发尚未完成,当前未激活。除非您是愿意帮助修复它的程序员,否则不要使用 perchild。
      【解决方案4】:

      查看 PHP chown() 函数

      【讨论】:

      • 如果不是超级用户运行,这个函数会失败。
      猜你喜欢
      • 2011-04-15
      • 2015-05-05
      • 2011-07-07
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 2021-06-11
      • 2018-06-09
      相关资源
      最近更新 更多