setfacl 命令详解

| 选择喜欢的代码风格  

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

setfacl 命令安装:


-bash: setfacl: command not found

#Debian
apt-get install acl

#Ubuntu
apt-get install acl

#Alpine
apk add acl

#Arch Linux
pacman -S acl

#Kali Linux
apt-get install acl

#CentOS
yum install acl

#Fedora
dnf install acl

#OS X
brew install acl

#Raspbian
apt-get install acl

#Docker
docker run cmd.cat/setfacl setfacl

setfacl 命令补充说明:


setfacl 实用程序设置文件和目录的访问控制列表(ACLs)。在命令行中,一系列命令后面跟着一系列文件(依次是另一系列命令,依此类推)。

选项 -m-x 在命令行上需要一个 ACL。多个 ACL 条目用逗号 , 分隔。选项 -M-X 从文件或标准输入读取 ACL。ACL 条目格式在下面的 ACL Entries 部分中描述。

--set--set file 选项设置文件或目录的 ACL。先前的 ACL 已被替换。此操作的 ACL 条目必须包含权限。

-m(--modify)-m(--modify file) 选项修改文件或目录的 ACL。此操作的 ACL 条目必须包含权限。

-x(--remove)-x(--remove file) 选项删除 ACL 条目。删除不存在的条目不是错误。只有不带 perms 字段的 ACL 条目才被接受为参数,除非定义了 POSIXLY_CORRECT 环境变量。

使用 -M-X 选项读取文件时,setfacl 接受 getfacl 生成的输出。每行最多有一个 ACL 条目。在磅符号 # 之后,行尾的所有内容都被视为注释。

如果在不支持 ACL 的文件系统上使用 setfacl,setfacl 将对文件模式权限位进行操作。如果 ACL 不完全适合权限位,setfacl 将修改文件模式权限位以尽可能地反映 ACL,将错误消息写入标准错误,并返回退出状态大于 0 的值。

文件所有者和能够 CAP_FOWNER 的进程被授予修改文件的 ACL 的权限,这类似于访问文件模式所需的权限。

在当前的 Linux 系统中,root 是唯一具有 CAP_FOWNER 功能的用户,因此如果您不是该文件的所有者,则必须是使用 setfacl 的超级用户。

setfacl 命令语法:


setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file ...
setfacl --restore=file

setfacl 命令选项:


-b,--remove-all:删除所有扩展的acl规则,基本的acl规则(所有者,群组,其他)将被保留。
-k,--remove-default:删除缺省的acl规则。如果没有缺省规则,将不提示。
-n,--no-mask:不要重新计算有效权限。setfacl默认会重新计算ACL mask,除非mask被明确的制定。
--mask:重新计算有效权限,即使ACL mask被明确指定。
-d,--default:设定默认的acl规则。
--restore=file:从文件恢复备份的acl规则(这些文件可由getfacl -R产生)。通过这种机制可以恢复整个目录树的acl规则。此参数不能和除--test以外的任何参数一同执行。
--test:测试模式,不会改变任何文件的acl规则,操作后的acl规格将被列出。
-R,--recursive:递归的对所有文件及目录进行操作。
-L,--logical:跟踪符号链接,默认情况下只跟踪符号链接文件,跳过符号链接目录。
-P,--physical:跳过所有符号链接,包括符号链接文件。
--version:输出setfacl的版本号并退出。
--help:输出帮助信息。
--:标识命令行参数结束,其后的所有参数都将被认为是文件名
-:如果文件名是-,则setfacl将从标准输入读取文件名。

setfacl 命令参数:


文件:指定要查看 ACL 的文件。

ACL 规则条目


[d[efault]:] [u[ser]:]uid [:perms]  指定用户的权限,文件所有者的权限(如果uid没有指定)。
[d[efault]:] g[roup]:gid [:perms]   指定群组的权限,文件所有群组的权限(如果gid未指定)
[d[efault]:] m[ask][:] [:perms]     有效权限掩码
[d[efault]:] o[ther] [:perms]       其他的权限

恰当的 ACL 规则被用在修改和设定的操作中,对于 uidgid ,可以指定一个数字,也可指定一个名字。perms 域是一个代表各种权限的字母的组合:读 -r-w 执行 -x,执行只适合目录和一些可执行的文件。pers 域也可设置为八进制格式。

setfacl 命令实例


授予用户 lisa 对文件文件的读取权限:

setfacl -m u:lisa:r file

撤消对文件文件的所有组和所有命名用户(使用有效权限掩码)的写访问权限:

setfacl -m m::rx file

从文件的 ACL 中删除组人员的组条目:

setfacl -x g:staff file

file1 的 ACL复制到 file2

getfacl file1 | setfacl --set-file=- file2

将访问 ACL 复制到默认 ACL 中。

getfacl --access dir | setfacl -d -M- dir

setfacl 及 ACL 相关命令的坑:


前面的例子中我们都注意到了 getfacl 命令是用来读取文件的 ACL,setfacl 是用来设定文件的 Access ACL。这里还有一个 chacl 是用来改变文件和目录的 Access ACL and Default ACL,它的具体参数可以看 man page。这里只提及一下 chacl -B。它可以彻底删除文件或者目录的 ACL 属性(包括 Default ACL),比如你即使用了 setfacl -x 删除了所有文件的 ACL 属性,那个 + 号还是会出现在文件的末尾,所以正确的删除方法应该是用chacl -B用cp来复制文件的时候我们现在可以加上-p选项。这样在拷贝文件的时候也将拷贝文件的ACL属性,对于不能拷贝的ACL属性将给出警告。

mv 命令将会默认地移动文件的 ACL 属性,同样如果操作不允许的情况下会给出警告。

需要注意:如果你的文件系统不支持 ACL 的话,你也许需要重新 mount 你的 file system:

mount -o remount, acl [mount point]

如果用 chmod 命令改变 Linux file permission 的时候相应的 ACL 值也会改变,反之改变 ACL 的值,相应的 file permission 也会改变。

setfacl 命令扩展阅读:




setfacl 命令评论