问题类似于为什么 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