「setfacl(1)」-

  LINUX MANUAL PAGES

设置文件的访问控制列表(ACL)

命令语法格式

setfacl [-bkndRLPvh] [{-m|-x} acl_spec] file …

setfacl [-bkndRLPvh] [{-M|-X} acl_file] file …

setfacl –restore=file

命令描述

命令setfacl设置文件和目录的“访问控制列表(ACL)”。在命令行上,一系列命令后面跟着一系列文件(后面可以跟着另一个命令序列,……)。

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

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

选项-x(–remove)和-X(–remove文件)删除ACL条目。删除不存在的条目不会产生错误。除非定义了POSIXLY_CORRECT,否则只接受没有perms字段的ACL条目作为参数。

选项-m和-x期望在命令行上使用ACL。多个ACL条目由逗号(,)分隔。选项-M和-X从文件或标准输入读取ACL。在「ACL ENTRIES」部分中描述ACL条目格式。

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

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

关于权限

在具有CAP_FOWNER功能的进程和文件所有者会被授予修改文件ACL的权限。这类似于访问文件模式所需的权限。 (在当前的Linux系统上,root是唯一具有CAP_FOWNER功能的用户。)

命令支持的选项及含义

-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会尝试还原所有者和拥有组。 如果输入包含标志注释(定义setuid、setgid、sticky位),则setfacl相应地设置这三个位;否则,它会清除它们。 除了`–test’之外,此选项不能与其他选项混合使用。

-R, –recursive
以递归方式对所有文件和目录应用操作。 此选项不能与`–restore’混合使用。

-L, –logical
逻辑行走,遵循目录的符号链接。 默认行为是遵循通过参数指定的符号链接,并跳过子目录中遇到的符号链接。仅与-R组合有效。 此选项不能与`–restore’混合使用。

-P, –physical
物理行走,不要遵循目录的符号链接。 这也会跳过通过参数指定的符号链接。 仅与-R组合有效。 此选项不能与`–restore’混合使用。


命令行选项结束。 所有剩余参数都被解释为文件名,即使它们以短划线开头。


如果文件名参数是单个破折号,则setfacl将从标准输入中读取文件列表。

–test
测试模式。 不会更改任何文件的ACL,而是列出生成的ACL。

-v, –version
显示版本信息并退出。

-h, –help
显示帮助信息并退出。

关于ACL条目(ACL ENTRIES)

命令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]

其他用户的权限。

分隔符和非分隔符之间的空格将被忽略。

在修改和设置操作中(选项-m,-M,–set(–set-file)),使用包括权限的适当ACL条目。没有perms字段的条目用于删除条目(选项-x和-X)。

对于uid和gid字段,您可以指定名称或数字。

字段perms是指示权限的字符组合:read(r),write(w),execute(x),仅当参数file是目录或已经具有某个用户(X)的执行权限时才执行。 或者,字段perms可以是八进制数字(0-7)。

自动创建的条目(AUTOMATICALLY CREATED ENTRIES)

最初,文件和目录仅包含所有者、组、其他的三个基本ACL条目。 为了使ACL有效,需要满足一些规则:

  • 无法删除三个基本条目。 每个基本条目类型必须只有一个条目。
  • 只要ACL包含命名用户条目或命名组对象,它还必须包含有效的权限掩码。
  • 只要ACL包含任何默认ACL条目,三个默认ACL基本条目(默认所有者、默认组、默认其他条目)也必须存在。
  • 每当默认ACL包含命名用户条目或命名组对象时,它还必须包含默认的有效权限掩码。

为了帮助用户确保这些规则,setfacl在以下条件下从现有条目创建条目:

  • 如果ACL包含命名用户或命名组条目,并且不存在掩码条目,则会创建包含与组条目相同权限的掩码条目。除非给出-n选项,否则将进一步调整掩码条目的权限,以包括受掩码条目影响的所有权限的并集。 (请参阅-n选项说明)。
  • 如果创建了默认ACL条目,并且默认ACL不包含所有者、拥有组、其他这三个条目,则会将ACL所有者、拥有组、其他这个三个条目的副本添加到默认ACL。
  • 如果默认ACL包含命名用户条目或命名组条目,并且不存在掩码条目,则添加包含与默认的默认ACL的组条目相同权限的掩码条目。 除非给出-n选项,否则将进一步调整掩码条目的权限,以包括受掩码条目影响的所有权限的并集。 (请参阅-n选项说明)。

如上所述。

注意事项

CONFORMANCE TO POSIX 1003.1e DRAFT STANDARD 17

如果定义了环境变量POSIXLY_CORRECT,则setfacl的默认行为将更改如下:禁用所有非标准选项。“default:”前缀被禁用。选项-x和-X也接受权限字段(并忽略它们)。

使用示例

授予其他用户读取权限:

# 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 –access dir | setfacl -d -M- dir

如上示例。

相关手册

getfacl(1), chmod(1), umask(1), acl(5)

参考文献

  • man 1 setfacl, Version 2.2.52-3+b1

更新日志

  • 10/10/2018 创建文章