为什么cp不遵守ACL?


15

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

$ 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也不考虑组所有权,但我可以理解为什么:您可能不希望仅仅因为更改了文件名而更改文件的权限。)


serverfault.com/a/452678/46333此答案包含一个很好的解释。
卡恩(Kaan)

Answers:


11

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

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

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


好吧,这至少可以解释其动机。(不过,奇怪的是,允许组所有权更改为“ felles”,从而可能使更多的人对该文件进行读取访问。)
bhm 2010年

3

好吧,这是一个三岁以上的问题,但仍然有意义。对于将来的读者,我想补充一点,期望mv,cp命令不会遵循目标目录的ACL。吉尔斯的答案很好,不过最后一句话。将目标的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将丢失。


1

我也遇到了类似的问题,即rsynced文件在目标子目录中缺少正确的默认ACL。Cp无法在目标上设置权限。但是,rsync会使用该--chmod=ugo=rwx标志。在这里查看我的答案。


0

您需要使用-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.

1
不完全是。他希望文件具有与目标文件夹相同的权限。
luckytaxi

0

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

setfacl -dm m::rwX foo

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


那没有用。foo的ACL(在命令之前和之后)是#文件:foo#所有者:bhm#组:falles#标志:-s- user :: rwx group :: rwx group:felles:rwx mask :: rwx其他: :rx默认值:user :: rwx默认值:group :: rwx默认值:group:felles:rwx默认值:mask :: rwx默认值:other :: rx
bhm

-1

您的文件系统是否已启用“ ACL”选项安装?

/dev/sda4        /wherefolderislocated         ext3        defaults,acl     1   2

如果不是,请进行更改,然后重新安装。

mount -o remount /wherefolderislocated

它是用acl选项安装的,是的。
bhm 2010年

-1

从我看来,您是cp之前和之后的文件(bhm)的所有者。如目录清单所示,所有者拥有读写访问权限!


也许我还不清楚:我希望(“伙计”)能够(读取和)写入文件。
bhm 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.