Solaris
如何將 ZFS ACL 從一個文件複製到另一個文件?
我想將所有 ZFS ACL 從一個文件複製到另一個文件。
使用 POSIX ACL,這可以通過管道輸出
getfacl
to 來完成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