为什么 cp 不尊重 ACL?

为什么 cp 不尊重 ACL?

在组内设置文件共享目录的常用方法是:

$ mkdir foo
$ chgrp felles foo
$ chmod g+ws foo
$ setfacl -m group:felles:rwx foo
$ setfacl -dm group:felles:rwx foo

这确保了创建的任何文件都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

但是,如果您将文件复制到中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--

为什么会发生这种情况?有没有什么办法可以解决?

移动目录中的文件不尊重 ACL 或组所有权,但我可以理解原因:您可能不希望文件的权限仅仅因为更改其名称而改变。)

答案1

如果cp创建目标文件,它将复制源文件的权限,但 umask 中设置的位除外。这是标准行为(例如,参见单一 Unix v3 (POSIX 2001) 规范

为什么 cp 会这样设计?因为在很多情况下这种行为是可取的,例如当原始权限受到限制时保护文件的隐私,而保留可执行性几乎总是正确的做法。然而不幸的是,甚至 GNU cp 也没有关闭此行为的选项。

大多数复制工具(例如 pax、rsync)的行为方式相同。您可以通过将源与目标分离来确保文件将以默认权限创建,例如使用cat <baz >foo/baz

答案2

好吧,这是一个三年多前的问题,但仍然有意义。对于未来的读者,我想补充一点,mv、cp 命令不遵循目标目录的 ACL 是意料之中的。Gilles 的回答很好,除了最后一句话。将目标的 ACL 应用于复制/移动文件的更好方法是这里提到的方式:

http://www.commandlinefu.com/commands/view/4281/copy-acl-of-one-file-to-another-using-getfacl-and-setfacl

为了防止将来链接坏掉,我将内容粘贴在这里:

getfacl <file-with-acl> | setfacl -f - <file-with-no-acl>

使用 getfacl 和 setfacl 将一个文件的 ACL 复制到另一个文件

警告:现有的 ACL 将丢失。

答案3

您需要使用-p--preservecp

man 5 acl

文件实用程序的变更

 On a system that supports ACLs, the file utilities ls(1), cp(1), and
 mv(1) change their behavior in the following way:

 ·   For files that have a default ACL or an access ACL that contains more
     than the three required ACL entries, the ls(1) utility in the long
     form produced by ls -l displays a plus sign (+) after the permission
     string.

 ·   If the -p flag is specified, the cp(1) utility also preserves ACLs.
     If this is not possible, a warning is produced.

 ·     The mv(1) utility always preserves ACLs. If this is not possible, a
     warning is produced.

 The effect of the chmod(1) utility, and of the chmod(2) system call, on
 the access ACL is described in CORRESPONDENCE BETWEEN ACL ENTRIES AND
 FILE PERMISSION BITS.

答案4

ACL 正确传播,但默认掩码似乎不正确。您可能希望默认掩码为 rwX。

setfacl -dm m::rwX foo

如果这不起作用,请发布 foo 的 ACL。

相关内容