如何将 ZFS ACL 从一个文件克隆到另一个文件?

Kam*_*iel 5 solaris zfs access-control-list

我想将所有 ZFS ACL 从一个文件克隆到另一个文件。

使用 POSIX ACL,这可以通过管道输出getfaclto 来完成setfacl

是否有一种简单快捷的方法可以使用 ZFS 中的 NFSv4 样式 ACL 执行此操作?我知道我可以读出 的输出,ls -lV然后将其作为 a 的一部分输入chmod,但我似乎找不到与复制 ACL 的 POSIX 方式等效的功能。

小智 5

除了使用,ls -lV您还可以使用ls -lvwhich 可以输入到脚本中,将其转换为一系列chmod命令以复制 ACL。

例如,如果 ACL 如下所示:

$ ls -lv file1
     0:owner@::deny
     1:owner@:read_data/write_data/append_data/write_xattr/execute
         /write_attributes/write_acl/write_owner:allow
     2:group@:read_data/write_data/append_data:deny
     3:group@:execute:allow
     4:everyone@:read_data/write_data/append_data/write_xattr
        /write_attributes/write_acl/write_owner:deny
     5:everyone@:read_xattr/execute/read_attributes/read_acl/synchronize:allow
Run Code Online (Sandbox Code Playgroud)

它应该变成以下chmod命令序列:

chmod A0=owner@::deny file2
chmod A1=owner@:read_data/write_data/append_data/write_xattr/execute/write_attributes/write_acl/write_owner:allow file2
chmod A2=group@:read_data/write_data/append_data:deny file2
chmod A3=group@:execute:allow file2
chmod A4=everyone@:read_data/write_data/append_data/write_xattr/write_attributes/write_acl/write_owner:deny file2
chmod A5=everyone@:read_xattr/execute/read_attributes/read_acl/synchronize:allow file2
Run Code Online (Sandbox Code Playgroud)

我最近发现自己处于一种情况,上面描述的脚本会很有用,所以这里有一个我制作的小 Bash 脚本(也可以从 shell 获取并作为函数运行)来打印必要的 chmod 命令列表将 ZFS ACL 从一个文件复制到另一个文件:

#!/bin/bash

acl_as_chmods () {
# 打印用于将 ACL 条目从“$1”复制到“$2”的 chmod 命令列表
 [[ -a "$1" ]] 2>/dev/null || {
   echo "需要有效的参考文件。" >&2
   返回 1
 }
 ls -vd "$1" | {
   read #第一行不是ACL信息;旁路
   读取 ACL_entry
     echo -n "chmod A=${ACL_entry#*:}"
   # 如果没有目标文件被指定为 '$2',则在运行时使用 'TARGET' 变量
   而读取 ACL_entry || { echo " ${2-\$TARGET}"; 错误的; }
   做
     [[ "$ACL_entry" == [0-9]*:* ]] && \
       echo -en " ${2-\$TARGET}\nchmod A${ACL_entry%%:*}+${ACL_entry#*:}" || \
       echo -n "$ACL_entry"
   完毕
 }
}

## 作为脚本或源函数运行到 shell?
__acl_as_chmods () {
 [[ "${FUNCNAME[1]}" == "source" ]] || acl_as_chmods "$@"
}

__acl_as_chmods "$@"

以下是上面file1的几个示例用法及其输出:

~$ ./acl_as_chmods.sh file1 file2
chmod A=owner@::deny file2
chmod A1+owner@:read_data/write_data/append_data/write_xattr/execute/write_attributes/write_acl/write_owner:allow file2
chmod A2+group@:read_data/write_data/append_data:deny file2
chmod A3+group@:execute:allow file2
chmod A4+everyone@:read_data/write_data/append_data/write_xattr/write_attributes/write_acl/write_owner:deny file2
chmod A5+everyone@:read_xattr/execute/read_attributes/read_acl/synchronize:allow file2

~$ 源 acl_as_chmods.sh
~$ acl_as_chmods file1
chmod A=owner@::deny $TARGET
chmod A1+owner@:read_data/write_data/append_data/write_xattr/execute/write_attributes/write_acl/write_owner:allow $TARGET
chmod A2+group@:read_data/write_data/append_data:deny $TARGET
chmod A3+group@:execute:allow $TARGET
chmod A4+everyone@:read_data/write_data/append_data/write_xattr/write_attributes/write_acl/write_owner:deny $TARGET
chmod A5+everyone@:read_xattr/execute/read_attributes/read_acl/synchronize:allow $TARGET

如果我们愿意,我们甚至可以直接评估这些 chmod,如果这两个文件都可以在此主机上访问,并且我们希望立即将 ACL 从file1复制到file2

~$ ls -Vd 文件* #BEFORE
-rwx--x--x 1 用户 user 0 Jun 19 04:12 file1
            所有者@:--------------:------:拒绝
            owner@:rwxp---AW-Co-:------:允许
            group@:rw-p---------:------:拒绝
            group@:--x-----------:------:允许
         每个人@:rw-p---AW-Co-:------:拒绝
         每个人@:--x---aRc--s:------:允许
---x------+ 1 个用户 user 0 Jun 19 04:12 file2
            owner@:--x-----------:------:允许

~$ eval "$(acl_as_chmods file1 file2)"

~$ ls -Vd 文件* #AFTER 
-rwx--x--x 1 用户 user 0 Jun 19 04:12 file1
            所有者@:--------------:------:拒绝
            owner@:rwxp---AW-Co-:------:允许
            group@:rw-p---------:------:拒绝
            group@:--x-----------:------:允许
         每个人@:rw-p---AW-Co-:------:拒绝
         每个人@:--x---aRc--s:------:允许
-rwx--x--x 1 个用户 user 0 Jun 19 04:12 file2
            所有者@:--------------:------:拒绝
            owner@:rwxp---AW-Co-:------:允许
            group@:rw-p---------:------:拒绝
            group@:--x-----------:------:允许
         每个人@:rw-p---AW-Co-:------:拒绝
         每个人@:--x---aRc--s:------:允许