ACL和umask之间的冲突

我有一个目录,可以读取和写入几个unix组。 这是通过使用ACL来实现的。 假设我是这样做的:

mkdir /tmp/test setfacl -d -mg:group1:rwx /tmp/test 

伟大的作品,整个组(和我添加的其他组)可以读/写这个目录。 但有一个例外:当有人使用mkdir -p创build子文件夹时,此目录是使用unix权限0755创build的,因为默认的umask是022.这会导致组中的其他用户无法再写入此问题子文件夹,因为ACL现在看起来像这样:

 group:group1:rwx #effective:rx 

出于某种原因,使用“mkdir”(不带-p参数)时不会发生这种情况。 一种解决scheme是将umask设置为002,但这确实是一件坏事,因为这也会影响在受ACL控制的目录之外创build的文件和目录,并且这些文件在默认情况下不应该是组可写的。

所以我想知道是否有另一种可能性来解决这个问题。 完全禁用/忽略ACL控制的目录的旧的unix样式权限内容是完美的。 或者禁用这个“有效的ACL”的东西。 那可能吗? 还是有另一种方法来解决这样的程序,如“mkdir -p”造成的不可写目录的问题? 最后,我想要一个完全(和recursion)可读写的目录,根据我已经configuration的ACL,这应该永远不会改变(只有通过修改ACL本身)。


注意:重现问题:

 $ mkdir /tmp/test $ setfacl -d -mg:group1:rwx /tmp/test $ umask 0022 $ mkdir /tmp/test/aa $ mkdir -p /tmp/test/bb $ ls -log /tmp/test drwxrwxr-x+ 2 4096 Mar 9 23:38 aa drwxr-xr-x+ 2 4096 Mar 9 23:38 bb $ getfacl /tmp/test/bb | grep ^group:group1 group:group1:rwx #effective:rx 

这是gnu mkdir的错误: http ://savannah.gnu.org/bugs/? mkdir没有办法禁用传统的Unix权限。 由于mkdir作品,你可以写一个覆盖mkdir的shell函数。 在shell函数中,在args中查找一个-p ,然后运行一系列不使用mkdir

许多基于Linux的系统现在使用umask 0002与用户私人组,所以这个问题没有出现。

这是gnu mkdir ( #14371 )的bug,它被固定在coreutils 8.22。

  • 受影响:Debian Wheezy 7,RHEL / CentOS 5和6受影响(可能是Ubuntu Trusty 14.04)
  • 不受影响:Debian 8 Jessie,RHEL / CentOS 7(可能还有Tbuntu Utopic 14.10)

有几个解决方法。

解决方法#1:包装 (已由Mark Wagnerbuild议)

由于mkdir的作品,你可以编写一个覆盖mkdir的shell函数(或者/ usr / local / bin / mkdir脚本,因为这在/ bin之前是很平常的)。 该脚本在参数中查找-p,然后recursion地调用mkdir而不使用“-p”。

解决方法#2:umask 0002

如果您可以控制调用mkdir的脚本,则可以在调用mkdir之前设置掩码:

 (umask 0002 ; mkdir -p /path/to/dir) 

你的其他问题:

所以我想知道是否有另一种可能性来解决这个问题。 完全禁用/忽略ACL控制的目录的旧的unix样式权限内容是完美的。

否,兼容性需要权限,也请阅读为什么组中的chmod(1)会影响ACL掩码?

或者禁用这个“有效的ACL”的东西。

没有

你有没有尝试设置包含目录的setgid位? 这应该对其中的所有新文件和目录执行相同的权限。