我在为多个用户访问同一组文件的系统设置系统时遇到了麻烦。 我读过tuts和文档,并与ACL玩,但还没有成功。
我的情景:
有多个用户,例如user1
和user2
,属于一个名为sharedusers
的组。 他们必须拥有对同一组文件和目录的所有WRITE权限,比如在/userdata/sharing/
。
我将文件夹的组设置为sharedusers
和SGID,将所有新创build的文件/目录设置为同一组。
ubuntu@home:/userdata$ ll drwxr-sr-x 2 ubuntu sharedusers 4096 Nov 24 03:51 sharing/
我为这个目录设置了ACL,这样我就可以拥有从其父母inheritance的子目录/文件的权限。
ubuntu@home:/userdata$ setfacl -m group:sharedusers:rwx sharing/ ubuntu@home:/userdata$ setfacl -d -m group:sharedusers:rwx sharing/
这是我得到的:
ubuntu@home:/userdata$ getfacl sharing/ # file: sharing/ # owner: ubuntu # group: sharedusers # flags: -s- user::rwx group::rx group:sharedusers:rwx mask::rwx other::rx default:user::rwx default:group::rx default:group:sharedusers:rwx default:mask::rwx default:other::rx
看起来没问题,因为当我创build新文件夹里面的新文件,权限是正确的。
ubuntu@home:/userdata/sharing$ mkdir a && cd a ubuntu@home:/userdata/sharing/a$ touch a_test ubuntu@home:/userdata/sharing/a$ getfacl a_test # file: a_test # owner: ubuntu # group: sharedusers user::rw- group::rx #effective:r-- group:sharedusers:rwx #effective:rw- mask::rw- other::r--
如您所见, sharedusers
组具有有效权限rw-
。
但是,如果我有一个zip文件,并使用unzip -q
命令解压缩文件夹sharing
内的文件,解压缩的文件夹没有组写入 permisison。 因此,来自组sharedusers
用户的用户不能修改这些提取的文件夹下的文件。
ubuntu@home:/userdata/sharing$ unzip -q Joomla_3.0.2-Stable-Full_Package.zip ubuntu@home:/userdata/sharing$ ll drwxrwsr-x+ 2 ubuntu sharedusers 4096 Nov 24 04:00 a/ drwxr-xr-x+ 10 ubuntu sharedusers 4096 Nov 7 01:52 administrator/ drwxr-xr-x+ 13 ubuntu sharedusers 4096 Nov 7 01:52 components/
您将发现文件夹a
(之前创build)和文件夹administrator
通过unzip
提取的权限不同。 以及administrator
内部文件的ACL:
ubuntu@home:/userdata/sharing$ getfacl administrator/index.php # file: administrator/index.php # owner: ubuntu # group: ubuntu user::rw- group::rx #effective:r-- group:sharedusers:rwx #effective:r-- mask::r-- other::r--
它也有ubuntu
组,不像预期的那样sharedusers
组。
有人可以解释这个问题,给我build议吗? 先谢谢你!
这是行为中的ACL_MASK。 看一下index.php
文件,它理论上得到了预期的权限group:sharedusers:rwx
,但是实际上是另一个group:sharedusers:rwx
#effective:r--
。 这是因为理论值与mask::r--
进行XOR mask::r--
,得到有效的结果,这就是你用ls -l
(或ll
)看到的结果。
现在,ACL mask::r--
MAS的ACL_MASK实际上就是ACL的一个安全特性,使您无法访问您不希望访问的内容:在添加现有文件(而不是创build新文件)时,ACL会设置ACL_MASK为文件的前一个值,在本例中为r--
。
这不限于解压缩。 这适用于每当你添加一个文件,而不是创build它。 例如,你可以尝试cp
或者tar
,最后得到相同的结果。
实际上,文档( man 5 acl
)在OBJECT CREATION AND DEFAULT ACL中指出, default
值仅适用于使用以下任何系统调用创build的对象: creat() , mkdir() , mknod() , mkfifo() ,或打开() 。
所以我不能给你一个好的解决scheme,因为你将无法使用ACL默认机制来完成你正在做的事情。