如何将目录的默认 ACL 递归地应用于其后代?

如何将目录的默认 ACL 递归地应用于其后代?

如果我有一个分配了默认 ACL 条目的目录,但其部分或全部后代文件和子目录具有与这些默认值不一致的访问权限或默认 ACL,我如何递归(重新)应用这些默认 ACL 条目给所有子孙?有资格。我希望完全替换所有现有的后代 ACL除了文件的现有执行状态。否则,所有后代都应该拥有在当前位置新创建的 ACL。

罗加奇问道“如何在目录上递归设置权限(启用 ACL)?”但希望添加一个新的递归地输入 ACL,而不是(重新)应用现有的默认 ACL。虽然罗加奇没有要求,富兰克林·皮亚特对这个问题的回答还为我的问题提供了解决方案,但我相信他的解决方案是有缺陷的。 Piat 建议使用这对命令:

find . -mindepth 1 -type d| xargs -n 50 setfacl -b --set-file=<(getfacl . | sed -e 's/x$/X/')
find . -mindepth 1 -type f| xargs -n 50 setfacl -b --set-file=<(getfacl . | grep -v '^default:' | sed -e 's/x$/X/')

我想修复的缺陷:

  • 当前目录的访问 ACL 正在传播到后代,而不是其默认 ACL,这不是我理解的 ACL 应该工作的方式。
  • 所有文件的执行位都被清除(sed是无效的)。
  • 典型的苏多尔当需要 root 权限时,策略会阻止进程替换工作。请参阅“closefrom_override”选项须藤者(5)

理想情况下,我也只需要一个命令行来完成这一任务。

答案1

我想出了这个丑陋、低效的解决方案,但肯定有更好的方法:

( cd '/some/dir' && sudo find . -mindepth 1 -path './leave/alone' -prune -o \( -type d -exec bash -c 'getfacl -cd . | sed -nre "p;/^\$/!s/^/default:/p" | setfacl -bM - "{}"' \; \) -o \( -type f -exec bash -c 'getfacl -cd . | sed -re "/^#/!s/x\$/X/" | setfacl -bM - "{}"' \; \) )

关于这个怪物的一些评论:

  • 我已经包含了一个子目录排除来证明这种频繁的要求。
  • 光盘消除了源目录路径容易出错的重复,并且外括号使该更改是临时的。
  • 指某东西的用途巴什需要,因为“-exec”不允许管道。它还避免了“!”角色调用历史替换并导致臭名昭著的“事件未找到”错误。
  • 对于子目录,我们必须应用源默认ACL 作为两个访问 ACL默认 ACL。
  • 对于文件,我们必须应用源默认 ACL 作为访问 ACL,但如果我们希望避免“仅目录可以有默认 ACL”警告,则根本不应用默认 ACL设定值
  • 对于文件,我们需要将源默认 ACL 中的“x”权限替换为“X”,以便我们最终不会强制全部文件变为可执行文件。该解决方案还保留了现有文件的可执行状态,但是仅有的因为我们使用“-bM -”而不是“--set-file=-”设定值
  • 这个命令行是非常效率低下,因为我不知道如何使用“-exec ... +”或参数而不是“-exec ... \;”。
  • 此命令行有效,但请注意后代文件获取的 ACL 是有效地与新创建新的后代文件时发生的情况等效但在技术上不等效。

“Unix 哲学”非常棒,但是我想要完成的任务太频繁了,以至于不需要如此笨拙的命令行。除了游说额外功能之外,还有更好的方法吗?设定值

相关内容