如何在 Mac OS X 上复制 ACL?

如何在 Mac OS X 上复制 ACL?

大多数unix衍生产品可以使用以下命令将ACL从一个文件复制到另一个文件:

getfacl filename1 | setfacl -f - filename2

不幸的是,Mac OS X 没有 getfacl 和 setfacl 命令,因为它们已将 ACL 处理纳入 chmod。chmod -E 接受 stdin 上的 ACL 列表,但我还没有找到可以在 stdout 上以合适格式输出 ACL 的命令。我想到最好的方法是:

ls -led filename1 | tail +2 | sed 's/^ *[0-9][0-9]*: *//' | chmod -E filename2

有没有更强大的解决方案?

附加问题:有没有一种好的方法可以在 Python 中做到这一点,而无需使用 10.6 中未附带的任何模块?

答案1

ls -e 如果存在,则在长(-l)输出中打印与文件关联的访问控制列表(ACL)。

其结果如下...

drwxr-xr-x@ 19 localadmin   646B Aug  4 00:21  APPBUNDLE
0: user:localadmin allow add_file,add_subdirectory,writeattr,writeextattr,writesecurity
                   ⬆    ⇧                      ⇶                                     ⬆

就我个人而言,我的~/.bash_profile

export FILE_ALL="read,write,append,execute,delete,readattr,writeattr,readextattr,writeextattr,readsecurity,writesecurity,chown"
export DIR_ALL="list,search,add_file,add_subdirectory,delete_child,readattr,writeattr,readextattr,writeextattr,readsecurity,writesecurity,chown"

使得这成为chmod可能……

sudo chmod +a "允许 localadmin $DIR_ALL" /APPBUNDLE

chmod手册页中,有一点信息......暗示确实可以做像你描述的那样的事情......

“ACL 是使用符号模式语法的扩展来操作的。每个文件都有一个 ACL,其中包含有序的条目列表。每个条目都引用一个用户或组,并授予或拒绝一组权限。如果存在同名的用户和组,则可以在用户/组名称前加上“user:”或“group:”以指定名称类型。”

chmod -E 从 stdin 读取 ACL 信息,以 ACE 的顺序列表形式显示,以换行符分隔。如果信息解析正确,则现有信息将被替换。

另外,我要大声呼喊批量修改,虽然很老套,但对 ACL 来说却很有用,修补工具系统

答案2

答案3

https://github.com/ptrrkssn/acltool可能会很有趣 - 它适用于 MacOS、FreeBSD、Linux 和 Solaris。我厌倦了每个系统上的不同 ACL 工具,因此决定创建一个在所有系统上都运行相同的工具...

有了它你可以做如下事情:

% acltool list-access  -v .
# file: .
# owner: peter (501)
# group: staff (20)
# type: directory
        group:everyone:-----d--------:-------:deny  # gid=12

% mkdir t

% acltool copy-access -v . t
t: ACL Updated

% acltool edac -v peter:full_set t
t: ACL Updated

% acltool lac t
# file: t
# owner: peter
# group: staff
          user:peter:rwxpDdaARWcCos:-------:allow
      group:everyone:-----d--------:-------:deny

(虽然存在一些错误,但是现在基本上可以正常工作)

答案4

您应该能够stat以合适的方式格式化其输出。

相关内容