我们使用创建了一个资产管理应用程序 Web 应用程序php
。该应用程序允许用户浏览、上传、重命名、替换资产(图像和 3D 模型等二进制文件)
我们在 Windows 环境中开发,一切工作正常,但是当我们托管在 Linux 服务器(joyent)中时,我们在某些情况下运行时遇到权限问题。下面是环境设置
我们的公共网络根文件夹位于home/jill/web/public
(webroot) 。所有资产都位于home/jill/web/public/assets
(资产根目录)下以及子文件夹中
以下是我们处理资产管理方式的用例 -
- 使用 ftp 程序和 ftp 用户 (ftpuser) 批量上传所有资产
- 使用 webadmin 用户 (jill) 批量上传所有资产,该用户是
home/jill/web/public
- 使用 Web 应用程序上传资源(默认 Web 用户是 www)
在上述所有用例中,我们还使用最新修改的文件覆盖资产。现在,webroot 中托管了一个 Flash 应用程序(游戏),它可以访问所有这些资源并在应用程序中加载。
现在,当我们尝试使用与最初由不同用户创建的用户 ID 不同的用户 ID 来覆盖/更新文件时,我们会遇到权限错误。
例子:尝试使用最初使用 ftp 用户上传的 Web 应用程序覆盖文件,反之亦然
我们可以如何处理这种情况,以便任何用户在 webroot\assets 下创建的任何文件或目录都可以由任何用户修改?
我是一名不熟悉 unix/linux 的开发人员,但我认为这与处理组和组权限有关,但我不确定如何设置?
答案1
尝试以下操作。 (这个已经在Lubuntu上测试过)
去家/吉尔/网络/公共并做:
ls -la
它将向您显示那里的文件和文件夹的详细信息。其中之一是资产(这只是一个例子,您的资产详细信息会有所不同):
-rw-r----- 1 user group 9275204 Jun 13 15:27 assets
这个想法是创建一个新组并使其成为资产的所有者,然后将所有用户添加到该组。
在服务器上创建一个新组。
groupadd assetgroup
将用户添加到新组:
usermod -a -G assetgroup ftpuser
usermod -a -G assetgroup jill
usermod -a -G assetgroup www
并改变所有权资产文件夹到资产组。 (-R表示递归改变)
sudo chgrp -R assetgroup assets/
答案2
这基本上有两件事:
1)对已经存在的文件和目录的权限:
艾伦的回答主要涵盖了这一点:创建一个特殊组,向其中添加可能需要的所有用户写文件。确保目录你上传的地方就是它本身可写对于该组:chmod 0775 path/to/the/directory
.任何现有文件都需要chmod 0664
.
“神奇”数字是八进制的,代表三元组:setuid、所有者权限、组权限、世界权限。您对 setuid 不感兴趣,保留它0
。对于其他的,八进制数(0-7)告诉您权限:如果第 0 位打开,则文件/目录是可执行的(对于目录,这意味着可以输入它),如果第 1 位打开,则文件/目录是可写的,第二位是管理可读性 - 例如0754
意味着所有者拥有所有权限,组成员可以读取和执行,而世界其他人只能读取它。您可以使用助记符编写相同的内容,如下所示:chmod u=rwx,g=rx,o=r
。请参阅man chmod
Linux 系统以获得深入的解释。
2)新建文件的权限:
umask
在上传时查找设置。这说明了创建新文件的权限。再次man umask
在 Linux/UNIX 系统上看到,其想法是,您设置的任何位umask
(与chmod
上面解释的符号相同)都是排除从新创建的文件的权限 - 例如,如果您设置umask
为0023
,您的文件将被创建为具有所有权限,您的默认组不可写入,其他任何人都不可写入或可执行。在这里设置第 0 位通常是个坏主意,因为在创建目录时,它会使其不可执行,从而完全阻止进入目录(对于设置了该位的用户集,在0023
“任何其他人”的示例中) )。
除此之外,如果底层文件系统支持默认 ACL,则可能值得将它们分配给目录。这将允许更细粒度的访问控制(ACL 代表访问控制列表,类似于 Windows)。请参阅man setfacl
获取更多信息。
大胖警告:让文件全局可写并不是一个好主意!将有效的权利保持在最低限度。