Solaris

如何將 ZFS ACL 從一個文件複製到另一個文件?

  • March 22, 2017

我想將所有 ZFS ACL 從一個文件複製到另一個文件。

使用 POSIX ACL,這可以通過管道輸出getfaclto 來完成setfacl

ZFS 中的 NFSv4 樣式 ACL 是否有一種簡單快捷的方法來執行此操作?我知道我可以讀取 的輸出,ls -lV然後將其作為 a 的一部分輸入chmod,但我似乎找不到與複製 ACL 的 POSIX 方式等效的功能。

ls -lV您可以使用which代替使用ls -lv,可以將其輸入腳本以將其轉換為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

它應該變成以下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

我最近發現自己遇到了一種情況,上面描述的腳本會很有用,所以這是我製作的一個小 Bash 腳本(也可以來自 shell 並作為函式執行)來列印必要的 chmod 命令列表將 ZFS ACL 從一個文件複製到另一個文件:

#!/bin/bash

acl_as_chmods () {
# 列印 chmod 命令列表以將 ACL 條目從“$1”複製到“$2”
[[ -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 || {迴聲“${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]}" == "源" ]] || acl_as_chmods "$@"
}

__acl_as_chmods "$@"

以下是上面file1的幾個範例用法及其輸出:

~$ ./acl_as_chmods.sh 文件1 文件2
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 文件1
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 文件* #之前
-rwx--x--x 1 使用者使用者 0 Jun 19 04:12 file1
所有者@:-------------:------:拒絕
owner@:rwxp---AW-Co-:------:允許
group@:rw-p----------:------:拒絕
組@:--x-----------:------:允許
所有人@:rw-p---AW-Co-:------:拒絕
大家@:--x---aRc--s:------:allow
---x--------+ 1 個使用者使用者 0 Jun 19 04:12 file2
所有者@:--x------------:------:允許

~$ eval "$(acl_as_chmods file1 file2)"

~$ ls -Vd 文件* #AFTER
-rwx--x--x 1 使用者使用者 0 Jun 19 04:12 file1
所有者@:-------------:------:拒絕
owner@:rwxp---AW-Co-:------:允許
group@:rw-p----------:------:拒絕
組@:--x-----------:------:允許
所有人@:rw-p---AW-Co-:------:拒絕
大家@:--x---aRc--s:------:allow
-rwx--x--x 1 使用者使用者 0 Jun 19 04:12 file2
所有者@:-------------:------:拒絕
owner@:rwxp---AW-Co-:------:允許
group@:rw-p----------:------:拒絕
組@:--x-----------:------:允許
所有人@:rw-p---AW-Co-:------:拒絕
大家@:--x---aRc--s:------:allow

引用自:https://serverfault.com/questions/38784