我管理一台 Mac Mini 服务器 OS X 10.8.5 Server 2.2.2。用作指定合作伙伴的文件共享,以便将视频文件上传到文件系统最低级别的各自文件夹(使用 Filezilla 访问)。这些用户的权限需要保持不变,并且不应超出其各自的文件夹及其子文件夹。
项目负责人需要通过 Filezilla 访问所有文件(可读取和写入)。
目前他们可以做到这一点,每个用户对每个文件夹都有单独的权限。我创建了一个组“访问”,它具有项目负责人所需的所有权限,并将其置于文件系统的最高级别,并应用继承。
我遇到的问题是按从高到低的顺序删除单个用户的权限。使用“传播权限”命令应用新 ACL 时,有时会从子文件夹中删除项目主管权限,有时则不会。
如何才能在整个文件结构中以递归方式删除特定用户的权限而不影响其余文件夹的权限?
答案1
查看 chmod -a 以删除特定的 ACL
来自 man chmod
-a The -a mode is used to delete ACL entries. All entries exactly matching the supplied entry will be deleted. If the entry lists a subset of rights granted by an entry, only the rights listed are removed. Entries may also be deleted by index using the -a# mode.
-R 会使操作递归
ls -le filename 将列出与 filename 关联的 ACL
理论上,你可以执行这个未经测试的脚本(我刚刚为你写好)来递归遍历所有文件并删除指定用户的 ACL
#!/bin/bash
OLDIFS=$IFS
IFS='
'
while read file
do
for ACL in $(ls -led $file|tail -n+2|cut -d':' -f2,3)
do
if [ $ACL ] && [[ $ACL =~ YourUserName ]]; then
echo ACL found: $ACL
echo FILE found: $file
echo "Removing ACL..."
chmod -a "$(echo $ACL|cut -d':' -f2)" ${file}
fi
done
done < <(find / )
IFS=$OLDIFS
假设 YourUserName 是您希望撤销其 ACL 的员工的姓名,并且 / 是文件系统中您希望递归的点,如果您使用 /,这将有效地执行整个文件系统,除非您添加 -maxdepth 参数来查找。
更新,我测试了它,它可以正常工作。只需将代码复制到文件中并另存为 aclchange.sh,然后将其放在要递归的目录的根目录中。将文件命令更改为 (find .),将 YourUserName 更改为要删除其 ACL 的用户。打开终端并 cd /directory/where/script_is,然后输入 chmod +x ./aclchange.sh 。最后 sudo ./aclchange.sh 它将运行并列出从这些文件中删除的文件和 ACL。