4

首先,我很抱歉我的英语不好,我不是母语人士。

我将 PHP 与 FCGI 一起使用,因此我的每个虚拟主机都以不同的用户身份运行它们的 php 脚本。

我需要在两个虚拟主机(user1 和 user2)之间共享一个 php 类,所以我决定将 user2 添加到 /etc/group 中的 user1 组是一个好主意。我这样做了,然后我使用以下命令测试了组权限是否正常工作:

su user2
cat /home/user1/shared_class.php

它工作正常(user2 访问 user1 类就好了)。

但是 PHP 似乎不承认同样的权限。我将以下脚本保存在 user2 虚拟主机中进行测试并从浏览器运行:

<?php
passthru('whoami');
passthru('cat /home/user1/shared_class.php');
?>

并且返回了正确的用户名('user2'),但没有返回 shared_class.php 的内容。如果我尝试 require_once('/home/user1/shared_class.php') 我也会收到“拒绝访问”错误。所以很明显PHP认为'user2'没有访问shared_class.php的权限。

我做的另一个测试是运行

su user1
chmod o+r /home/user1/shared_class.php

在最后一个 chmod 之后,'user2' PHP 脚本可以很好地读取文件,所以我确定这不是文件夹限制(open_basedir 或其他一些指令),它只是 PHP 忽略了 /etc/group。

这是预期的吗?有没有办法做到这一点?

我现在使用的解决方法是

su user1
chown user1:user2 /home/user1/shared_class.php

这样,user2 可以很好地从 php 访问文件,但我希望能够共享文件而无需手动更改 chown 设置,即使用 /etc/group 并将 user2 添加到 user1 组。

谢谢。

4

1 回答 1

0

我要检查的第一件事是 SELinux 设置(如果有的话),你可以通过运行来检查

getenforce

注意:chown user1:user2将用户所有权user1组所有权更改为user2,它不会将用户的权限堆叠在权限中。

并且:用户需要在目录上有 +x 才能遍历它:)

PHP CGI 将作为您告诉它的任何人运行,我使用的大多数 PHPCGI 服务也将允许您指定进程组。

我会建议:

  1. 创建一个名为phpcgi
  2. 使 user1 & user2 成为主要组phpcgi
  3. 将 CGI 进程更改为运行phpcgi
  4. 对于文件:
    1. 将所有权设置为%USER%:phpcgi
    2. chmod 0660
  5. 对于文件夹:
    1. 将所有权设置为%USER%:phpcgi
    2. chmod 0770

然后重新启动一切并再试一次:)

于 2013-02-25T08:41:26.113 回答