bhm*_*bhm 20 linux access-control-list
在组内设置文件共享目录的常用方法是:
$ mkdir foo
$ chgrp felles foo
$ chmod g+ws foo
$ setfacl -m group:felles:rwx foo
$ setfacl -dm group:felles:rwx foo
Run Code Online (Sandbox Code Playgroud)
这确保了创建的任何文件foo都可以被组读写felles:
$ umask
0022
$ echo hi > foo/bar
$ ls -l foo
total 4
-rw-rw-r--+ 1 bhm felles 3 2010-09-23 00:18 bar
Run Code Online (Sandbox Code Playgroud)
但是,如果您将文件复制到 中foo,则不会应用默认 ACL:
$ echo you > baz
$ cp baz foo/
$ ls -l foo
total 8
-rw-rw-r--+ 1 bhm felles 3 2010-09-23 00:18 bar
-rw-r--r--+ 1 bhm felles 4 2010-09-23 00:19 baz
$ getfacl foo/baz
# file: foo/baz
# owner: bhm
# group: felles
user::rw-
group::rwx #effective:r--
group:felles:rwx #effective:r--
mask::r--
other::r--
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况,有没有办法解决?
(将文件移动到目录中既不尊重 ACL 也不尊重组所有权,但我可以理解原因:您可能不希望文件的权限仅仅因为更改了名称而更改。)
Gil*_*il' 11
如果cp创建目标文件,它会复制源文件的权限,但在 umask 中设置的位除外。这是标准的行为(见例如步骤3.B单一Unix V3(POSIX 2001)规格。
为什么cp是这样设计的?因为在很多情况下这种行为是可取的,例如在原始权限受到限制时保留文件的隐私,并且保留可执行性几乎总是正确的做法。然而不幸的是,即使是 GNU cp 也没有关闭这种行为的选项。
大多数复制工具(例如 pax、rsync)的行为方式相同。您可以通过将源与目标解耦来确保使用默认权限创建文件,例如使用cat <baz >foo/baz.
嗯,这是一个三年前的问题,但仍然相关。对于未来的读者,我想补充一点,mv、cp 命令不应遵循目标目录的 ACL。吉尔斯的回答都很好,除了最后一句话。将目标的 ACL 应用于复制/移动的文件的更好方法是这里提到的方法:
如果以后链接被破坏,我将内容粘贴到这里:
getfacl <file-with-acl> | setfacl -f - <file-with-no-acl>
Run Code Online (Sandbox Code Playgroud)
使用 getfacl 和 setfacl 将一个文件的 ACL 复制到另一个文件
警告:现有 ACL 将丢失。