为什么使用 cp 复制的文件没有根据默认 ACL 设置权限?

为什么使用 cp 复制的文件没有根据默认 ACL 设置权限?

问题类似于为什么 cp 不尊重 ACL?关于服务器故障/home/myuser但有一件事不同:我设置了在文件夹和子文件夹中创建的新文件的默认权限:

setfacl -dR -m u::rwx,g::rx,o::rx ~ 2> /dev/null

getfacl ~命令给出以下输出:

getfacl: Removing leading '/' from absolute path names
# file: home/lohacker
# owner: lohacker
# group: lohacker
user::rwx
group::r-x
other::---
default:user::rwx
default:group::r-x
default:other::r-x

文件夹 ACL 权限在创建新文件但不使用命令复制新文件时生效cp,即使我不保留源文件的权限。
例如,有这样的功能:

cp () {
    command cp -a --no-preserve=mode,ownership --remove-destination "$@"
    return $?
}

假设我在~

> file.txt
cp file.txt file2.txt
ls -l file.txt file2.txt
getfacl file.txt file2.txt

给我输出:

-rw-rw-r-- 1 lohacker lohacker 0 Jul 26 13:05 file2.txt
-rw-r--r-- 1 lohacker lohacker 0 Jul 26 13:05 file.txt

# file: file.txt
# owner: lohacker
# group: lohacker
user::rw-
group::r--
other::r--

# file: file2.txt
# owner: lohacker
# group: lohacker
user::rw-
group::rw-
other::r--

我本来期望-rw-r--r--这两个文件,但不幸的是事实并非如此。
有没有办法使用命令来解决问题cp,但不必保留源文件的权限?

答案1

setfacl -bR ~ 2> /dev/null我可以不使用ACL而是使用命令来更改默认权限umask,所以解决方案是注释掉/etc/login.defs文件中的一行。这:

UMASK       022

变成:

#UMASK      022

通过UMASK在 中取消设置/etc/login.defs,该值不再受变量值的影响USERGROUPS_ENAB,变量值被设置为yes并且很方便,因为有了它,在执行命令时deluser,与用户 uid 相同 gid 且与用户同名的组是也删除(如果该组没有其他成员),无需稍后执行。

# If USERGROUPS_ENAB is set to "yes", that will modify this UMASK default value
# for private user groups, i. e. the uid is the same as gid, and username is
# the same as the primary group name: for these, the user permissions will be
# used as group permissions, e. g. 022 will become 002.

这样,cp 命令将赋予-rw-r--r--复制的文件,即使不保留权限。

这是一般公式:

perl -pi -e 's/^\h*(UMASK\h+.*[^\h])\h*$/#\1/i' /etc/login.defs

相关内容