使用以下命令复制文件时 cp 会覆盖我的默认权限设置: cp -r --no-preserve=all

使用以下命令复制文件时 cp 会覆盖我的默认权限设置: cp -r --no-preserve=all

我的默认 umask 是077.当我创建目录时,它具有权限700

mkdir AA
$ stat -c'%A %n' AA/               
drwx------ AA/

现在我想将默认权限递归设置为 750:

setfacl -R --default --modify g::rx,o::--- AA

并确认其按预期工作:

$ touch AA/zz
$ stat -c'%A %n' AA/zz
-rw-r----- AA/zz

现在我想ZZ在我的新目录中复制另一个现有目录AA

$ stat -c'%A %n' ZZ ZZ/zz 
drwx------ ZZ
-rw------- ZZ/zz

现有目录具有权限700并且内部文件具有600.

$ cp -r --no-preserve=all ZZ/ AA/

$ stat -c'%A %n' AA/ZZ AA/ZZ/zz 
drwx------ AA/ZZ
-rw------- AA/ZZ/zz

但我的 umask 不被尊重,即使我曾经--no-preserve=all专门不从现有的ZZ.

如何使行为与我用来创建新文件cp时的行为相同?touch无论原始权限是什么,我都想复制现有的目录结构,同时遵循我的默认 umask/setfacl 设置。

答案1

解决方案: 使用 Debian 11.5 / cp (GNU coreutils) 8.32

1) 这将使用您的用户 umask:

$ cp -r --no-preserve=all ZZ/ AA/

2) 这将使用目标目录中的有效 umask:

$ cp -r ZZ/ AA/

3)这不会使用任何umask:

$ cp -r --preserve=all ZZ/ AA/

你作为(可以在AA目录中创建文件的用户)没有限制覆盖您创建的文件的默认模式。这包括使用实用程序时CP。只要您有写权限,Acl 就不会限制您创建任何文件权限。

结论:一切按预期进行。实用性CP还需要一个选项来使用用户 umask 和 acl(如果存在)。

#=================================================== ========

这是“acl”手册的一部分:

文件实用程序的更改

在支持 ACL 的系统上,文件实用程序 ls(1)、cp(1) 和 mv(1) 按以下方式更改其行为:

• 对于具有默认ACL 或包含三个以上所需ACL 条目的访问ACL 的文件,由ls -l 生成的长格式的ls(1) 实用程序会在权限字符串后显示一个加号(+)。

如果指定了 -p 标志,cp(1) 实用程序还会保留 ACL。如果不可能,则会发出警告。 ......

#------------------------------------------------- ----------------

标准

IEEE 1003.1e 草案 17(“POSIX.1e”)文档描述了 IEEE 1003.1 标准的多个安全扩展。虽然 1003.1e 的工作已被放弃,但许多 UNIX 风格的系统实现了 POSIX.1e 草案 17 或早期草案的部分内容。

Linux 访问控制列表实现了 POSIX.1e 中为访问控制列表定义的全套函数和实用程序以及一些扩展。该实现完全符合 POSIX.1e 草案 17;扩展名如此标记。访问控制列表操作函数在 ACL 库(libacl、-lacl)中定义。 POSIX 兼容接口在 <sys/acl.h> 标头中声明。这些函数的 Linux 特定扩展在 <acl/libacl.h> 标头中声明。

相关内容