linux – 为什么cp不尊重ACL?

前端之家收集整理的这篇文章主要介绍了linux – 为什么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或组所有权,但我可以理解为什么:您可能不希望仅仅因为更改其名称而更改文件的权限.)

解决方法

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

为什么cp这样设计?因为在许多情况下需要这种行为,例如在原始权限是限制性时保留文件的隐私,并且保持可执行性几乎总是正确的.然而,遗憾的是,即使GNU cp也没有选择关闭此行为.

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

猜你在找的Linux相关文章