目录上的默认 FACL
默认 ACL 仅在目录上创建。
当我们在目录上设置默认 ACL 时,在该目录中创建的任何文件也将自动分配该默认 FACL。
要在目录上创建默认 FACL:
# setfacl -m default:u:john:rw /accounts
# getfacl accounts/ # file: accounts/ # owner: root # group: root user::rwx group::r-x other::r-x default:user::rwx default:user:john:rw default:group::r-x default:mask::rwx default:other::r-x
现在在帐户目录中创建一个新文件并列出文件上的 FACL:
# touch /accounts/test # getfacl test # file: test # owner: root # group: root user::rw user:john:rw group::r-x #effective:r- mask::rw other::r-
如何知道文件何时添加了 ACL
很容易知道文件何时添加了 ACL。
ls -l 命令将产生如下所示的输出。
# ls -l -rw-r--r-+ 1 root root 0 Sep 19 14:41 file
请注意权限末尾的 + 号。
这确认文件添加了 ACL。
创建和管理 FACL
FACL是文件访问控制列表。
setfacl 命令用于在给定文件上设置 ACL。
要授予用户 john 对文件 /tmp/test 的 rw 访问权限:
# setfacl -m u:john:rw /tmp/test
-m 选项告诉 setfacl 修改命令行中提到的文件上的 ACL。
我们可以有一个组来对文件具有特定权限,而不是用户 john:
# setfacl -m g:accounts:rw /tmp/test
也可以使用单个命令设置多个用户和组的 FACL:
# setfacl -m u:john:rw,g:accounts:rwx /tmp/test
为什么我们需要 ACL?
任何 UNIX 文件系统上的每个文件都有一个所有者/组和一组权限。
想象一个案例,当多个用户需要访问同一个文件并且用户来自不同的组时。
文件访问控制列表 (FACL) 或者简称 ACL 是其他用户/组及其对文件的权限的列表。
查看 ACL
要显示文件的详细 ACL 信息,请使用 getfacl 命令。
# getfacl /tmp/test # file: test # owner: root # group: root user::rw user:john:rw user:sam:rwx group::r- mask::rwx other:--
注意 3 个不同的用户:行。
第一行列出了文件所有者的标准文件权限。
其他 2 个用户权限是用户 john 和 sam 的个人权限。
这里的掩码字段仅适用于我们赋予用户和组的另外权限。
如果掩码设置为 rwx,则将向其他用户/组授予读取、写入和执行权限。
如果掩码设置为 r-x,则不会向其他用户/组授予写权限。
通常,不要将掩码设置为 rwx 以外的任何内容。
掩码值不影响标准 UNIX 用户/组/其他权限。
没有 ACL 的文件
如果在没有 ACL 的文件上运行 getfacl 命令,则不会显示另外的“user:”行和“mask”行,并且会显示标准文件权限。
# getfacl test # file: test # owner: root # group: root user::rw group::r- other::r-
删除 FACL
要删除 FACL,请使用带有 -x 选项的 setfacl 命令:
# setfacl -x u:john /tmp/test
上述命令删除文件 /tmp/test 上用户 john 的 ACL。
其他用户/组的 ACL(如果有)不受影响。
要删除与文件关联的所有 ACL,请使用带有 setfacl 的 -b 选项:
# setfacl -b /tmp/test
备份 FACL
很多时候,备份软件可能不会复制文件上与 FACL 相关的元数据。
在这种情况下,我们可能希望备份有关文件的 FACL 信息。
现在,可以将目录中所有文件(包括所有子目录)的 FACL 复制到单个文件中。
# cd /accounts # getfacl -R * > accounts_facl ( -R -> recursive )
恢复 FACL
当我们恢复 /accounts 目录中的文件时,我们必须恢复与该目录中的文件关联的 FACL。
要做到这一点,请使用 FACL 备份文件 account_facl 和 -restore 选项:
# setfacl --restore=accounts_facl