Setfacl 语法
setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file ...
setfacl --restore=file
ACL 条目
setfacl 实用程序识别以下 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 条目,包括权限。
(选项 -m、-M、--set 和 --set-file)。
没有 perms 字段的条目用于删除条目(选项 -x 和 -X)。
对于 uid 和 gid,我们可以指定名称或者数字。
perms 字段是指示权限的字符组合:读取 (r)、写入 (w)、执行 (x)、仅当文件是目录或者已对某些用户 (X) 具有执行权限时才执行。
或者, perms 字段可以是八进制数字 (0-7)。
权限
具有 CAP_FOWNER 权限的文件所有者和进程被授予修改文件 ACL 的权限。
这类似于访问文件模式所需的权限。
(在当前的 Linux 系统上,root 是唯一具有 CAP_FOWNER 功能的用户。
)
Setfacl选项
-b, --remove-all
- 删除所有扩展 ACL 条目。保留所有者、组和其他人的基本 ACL 条目。
-k, --remove-default
- 删除默认 ACL。如果不存在默认 ACL,则不会发出警告。
-n, --no-mask
- 不要重新计算有效权限掩码。 setfacl 的默认行为是重新计算 ACL 掩码条目,除非明确给出掩码条目。掩码条目设置为拥有组的所有权限以及所有命名用户和组条目的联合。 (这些正是受掩码条目影响的条目)。
--mask
- 即使明确给出了 ACL 掩码条目,也要重新计算有效的权限掩码。 (请参阅 -n 选项。)
-d, --default
- 所有操作都适用于默认 ACL。
输入集中的常规 ACL 条目被提升为默认 ACL 条目。输入集中的默认 ACL 条目将被丢弃。 (如果发生这种情况会发出警告)。
--restore=file
- 恢复由
getfacl -R
或者类似方法创建的权限备份。使用此机制恢复完整目录子树的所有权限。如果输入包含所有者注释或者组注释,并且 setfacl 由 root 运行,则所有文件的所有者和所属组也会恢复。此选项不能与除“--test”之外的其他选项混合使用。
--test
- 测试模式。列出生成的 ACL,而不是更改任何文件的 ACL。
-R, --recursive
- 递归地将操作应用于所有文件和目录。此选项不能与“--restore”混合使用。
-L, --logical
- 逻辑行走,遵循符号链接。默认行为是遵循符号链接参数并跳过子目录中遇到的符号链接。此选项不能与“--restore”混合使用。
-P, --physical
- 物理行走,跳过所有符号链接。
这也会跳过符号链接参数。此选项不能与“--restore”混合使用。
--version
- 打印 setfacl 的版本并退出。
--help
- 打印帮助解释命令行选项。
命令行选项结束。
所有剩余的参数都被解释为文件名,即使它们以破折号开头。
如果文件名参数是单个破折号,则 setfacl 从标准输入读取文件列表。
使用 Setfacl
首先,尝试为主目录中的文件夹设置一个基本列表。
由于我们是第一次尝试这个,所以制作一个新的。
这样,我们就不会冒险将自己锁定在重要文件之外。
mkdir ~/acl-test
接下来,使用 setfacl 授予系统上的另一个用户访问该文件夹的权限。
Setfacl 使用 -m 标志来修改文件的访问控制列表。
这通常意味着添加用户或者组。
setfacl -m u:username:rwx ~/acl-test/
第一个冒号之前的 u 告诉命令我们正在谈论用户名。
第二个之后的 rwx 授予读取、写入和执行权限。
通过在第一个冒号前指定 g 而不是 u,这同样适用于组。
setfacl -m g:groupname:rwx ~/acl-test/
除了向整个组授予权限之外,它的工作方式与前面的示例相同。
-x 标志的作用与 -m 相反。
它将撤销对指定用户或者组的访问权限。
setfacl -x u:username:w ~/acl-test/
该命令撤销用户对该目录的写访问权。
我们也可以直接修改当前所有用户的权限。
这包括文件的所有者和被授予权限的任何其他用户。
这是一种快捷方式,使用现有命令但省略用户名。
setfacl -m u::rx ~/acl-test/
这会授予所有现有用户读取和执行权限,但会删除写入权限。
同样适用于 -x 标志和删除权限。
setfacl -x u::w ~/acl-test/
这与前面的示例基本相同,倒置。
setfacl 还允许我们将访问控制列表从一个文件复制到另一个文件。
确保用户对 test 文件夹具有完全访问权限,并创建两个新文件以使用。
touch ~/acl-test/file{1,2}.txt
现在,修改第一个文件的权限。
setfacl -m u:username:rx ~/acl-text/file1.txt
现在,我们可以将用于检索当前 ACL 信息的命令 getfacl 的结果通过管道传输到 setfacl 中。
getfacl ~/acl-test/file1.txt | setfacl --set-file=- ~/acl-text/file2.txt
第二个填充将具有与第一个相同的权限。
最后,我们可以删除该命令创建的所有扩展 ACL 条目。
这将使文件具有它最初拥有的用户和组权限。
为此,请使用 -b 标志。
setfacl -b ~/acl-test/
这些是 setfacl 最常见的用途。
如果我们想深入了解,本教程的下一部分是该命令的完整技术分解。
Setfacl 实用程序设置文件和目录的访问控制列表 (ACL)。
在命令行上,一系列命令后跟一系列文件(依次可以跟随着另一个命令序列等)。
- 选项 -m 和 -x 需要命令行上的 ACL。多个 ACL 条目由逗号字符 (
,
) 分隔。选项 -M 和 -X 从文件或者标准输入读取 ACL。 ACL 条目格式在 ACL 条目部分中描述。 - --set 和 --set-file 选项设置文件或者目录的 ACL。之前的 ACL 被替换。此操作的 ACL 条目必须包含权限。
- -m (--modify) 和 -M (--modify-file) 选项修改文件或者目录的 ACL。
此操作的 ACL 条目必须包含权限。
- -x (--remove) 和 -X (--remove-file) 选项删除 ACL 条目。除非定义了 POSIXLY_CORRECT,否则只接受没有 perms 字段的 ACL 条目作为参数。
当使用 -M 和 -X 选项读取文件时,setfacl 接受 getfacl 产生的输出。
每行最多有一个 ACL 条目。
在井号 (#
) 之后,直到行尾的所有内容都被视为注释。
如果在不支持 ACL 的文件系统上使用 setfacl,则 setfacl 对文件模式权限位进行操作。
如果 ACL 不完全适合权限位,则 setfacl 修改文件模式权限位以尽可能接近地反映 ACL,将错误消息写入标准错误,并以大于 0 的退出状态返回。
自动创建的条目
最初,文件和目录仅包含所有者、组和其他人的三个基本 ACL 条目。
为了使 ACL 有效,需要满足一些规则:
- 不能删除三个基本条目。这些基本条目类型中的每一种都必须恰好有一个条目。
- 每当 ACL 包含命名用户条目或者命名组对象时,它还必须包含有效的权限掩码。
- 每当 ACL 包含任何默认 ACL 条目时,三个默认 ACL 基本条目(默认所有者、默认组和默认其他)也必须存在。
- 每当默认 ACL 包含命名用户条目或者命名组对象时,它还必须包含默认有效权限掩码。
为了帮助用户确保这些规则,setfacl 在以下条件下从现有条目创建条目:
- 如果ACL包含命名用户或者命名组条目,并且不存在掩码条目,则创建一个包含与组条目相同权限的掩码条目。除非给出 -n 选项,否则掩码条目的权限将进一步调整以包括受掩码条目影响的所有权限的联合。 (请参阅 -n 选项说明)。
- 如果创建了默认 ACL 条目,并且默认 ACL 不包含所有者、拥有组或者其他条目,则将 ACL 所有者、拥有组或者其他条目的副本添加到默认 ACL。
- 如果默认 ACL 包含命名用户条目或者命名组条目,并且不存在掩码条目,则会添加包含与默认默认 ACL 的组条目相同权限的掩码条目。除非给出 -n 选项,否则掩码条目的权限将进一步调整以包括受掩码条目影响的所有权限的联合。 (请参阅 -noption 说明)。
setfacl示例
- 授予另外的用户读取权限
setfacl -m u:lisa:r file
- 撤销所有组和所有指定用户的写访问权限(使用有效权限掩码)
setfacl -m m::rx file
- 从文件的 ACL 中删除命名组条目
setfacl -x g:staff file
- 将一个文件的 ACL 复制到另一个文件
getfacl file1 | setfacl --set-file=- file2
- 将访问 ACL 复制到默认 ACL
getfacl -a dir | setfacl -d -M- dir