我有一个目录,可以由几个 unix 组读取和写入。这是通过使用 ACL 实现的。假设我这样做了:
mkdir /tmp/test
setfacl -d -m g:group1:rwx /tmp/test
效果很好,整个组(以及我添加的其他组)都可以读取/写入此目录。但有一个例外:当有人使用创建子文件夹时,mkdir -p
此目录将使用 unix 权限 0755 创建,因为默认 umask 为 022。这会导致该组的其他用户无法再写入此子文件夹的问题,因为 ACL 现在如下所示:
group:group1:rwx #effective:r-x
由于某种原因,使用“mkdir”(不带 -p 参数)时不会发生这种情况。一种解决方案是将 umask 设置为 002,但这确实是一件坏事,因为这还会影响在 ACL 控制的目录之外创建的文件和目录,而这些文件默认情况下不应是组可写的。
所以我想知道是否还有其他可能解决这个问题。如果能够完全禁用/忽略 ACL 控制目录的旧 unix 样式权限,那就完美了。或者禁用这个“有效 ACL”东西。这可能吗?或者还有其他方法可以解决由“mkdir -p”等程序导致目录无法写入的问题?最后,我想要一个根据我配置的 ACL 完全(递归地)可读可写的目录,并且这永远不会改变(只能通过修改 ACL 本身)。
注意:重现该问题:
$ mkdir /tmp/test
$ setfacl -d -m g: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:r-x
答案1
这是 gnu 的一个错误mkdir
:http://savannah.gnu.org/bugs/?19546没有办法禁用传统的 Unix 权限。既然mkdir
可以,您可以编写一个覆盖 的 shell 函数mkdir
。在 shell 函数中查找-p
args 中的 a 并运行一系列不使用 p 的mkdir
s 。
许多基于 Linux 的系统现在对用户私有组使用 umask 0002,因此不会出现这个问题。
答案2
这是 gnu 的一个错误mkdir
(#14371),已在 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 Wagner 已建议)
由于 mkdir 有效,您可以编写一个覆盖 mkdir 的 shell 函数(或脚本 /usr/local/bin/mkdir,因为这通常在 /bin 之前)。该脚本在参数中查找 -p,然后递归调用不带“-p”的 mkdir。
解决方法 #2:umask 0002
如果您可以控制调用 mkdir 的脚本,则可以在调用 mkdir 之前设置掩码:
(umask 0002 ; mkdir -p /path/to/dir)
您的其他问题:
所以我想知道是否有其他可能解决这个问题。如果能够完全禁用/忽略 ACL 控制目录的旧式 unix 样式权限设置,那就太完美了。
否,兼容性需要许可,另请阅读为什么组上的 chmod(1) 会影响 ACL 掩码?
或者禁用这个“有效 ACL”。
不
答案3
您是否尝试过在包含的目录中设置 setgid 位?这应该会对其中的所有新文件和目录强制实施相同的权限。