大多数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 的顺序列表形式显示,以换行符分隔。如果信息解析正确,则现有信息将被替换。
答案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
以合适的方式格式化其输出。