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:------:允许
| 归档时间: |
|
| 查看次数: |
3477 次 |
| 最近记录: |