我认为答案是“这就是它的工作原理”,但我想我应该问一下,以防我做错了什么。
我的帐户的默认 umask 是0077
。我在wheel
组里。
我有一个具有此 ACL 的目录:
# file: .
# owner: root
# group: wheel
# flags: -s-
user::rwx
group::rwx
other::r-x
default:user::rwx
default:group::rwx
default:group:wheel:rwx
default:mask::rwx
default:other::r-x
我创建了一个文件,并根据上面的ACL正确设置了权限。
$ touch z
$ ls -al
drwxrwsr-x+ 2 root wheel 4,096 Aug 7 12:36 .
drwxr-xr-x. 7 root root 4,096 Aug 6 17:31 ..
-rw-rw-r--+ 1 ehymowitz wheel 0 Aug 7 12:36 z
我现在确定这是一个可执行文件,因此我更改了权限。这次,确实如此不是遵循 ACL,它遵循 umask。
$ chmod +x z
$ ls -al
drwxrwsr-x+ 2 root wheel 4,096 Aug 7 12:36 .
drwxr-xr-x. 7 root root 4,096 Aug 6 17:31 ..
-rwxrw-r--+ 1 ehymowitz wheel 0 Aug 7 12:36 z
我需要指定a+x
才能完成这项工作。
$ chmod a+x z
$ ls -al
drwxrwsr-x+ 2 root wheel 4,096 Aug 7 12:36 .
drwxr-xr-x. 7 root root 4,096 Aug 6 17:31 ..
-rwxrwxr-x+ 1 ehymowitz wheel 0 Aug 7 12:36 z
我想我只是不明白为什么touch
根据ACL创建文件,却chmod
忽略ACL来调整权限。
答案1
chmod 的显式功能。
man chmod
字母 ugoa 的组合控制哪些用户对文件的访问权限将被更改:拥有该文件的用户 (u)、文件组中的其他用户 (g)、不在文件组中的其他用户 (o) 或所有用户用户(一)。如果没有给出这些,则效果就像给出了 (a),但 umask 中设置的位不受影响。
如果您想查看有关 ACL 的一些相关想法,我发现了一个内容丰富的答案。它可以让您查看设置文件权限的系统调用的确切详细信息。 (谢谢slm!)
然而,它不一定是关于如何使用这些细节的良好介绍。一旦您开始想要使用默认 ACL(或传统的 set-GID),*nix 权限就会变得非常奇怪。目前存在一个限制,即不支持您想要的最一致行为的 umask在使用 systemd 的多用户工作站操作系统上(并且 udisks 还使用错误的权限位挂载 FAT 文件系统)。
默认 ACL 可能用于 Windows 工作站的 Unix 文件服务器上。我认为在某些情况下,这可能涉及使用 hacky Samba 配置来有效地覆盖 umask。当然,Linux 可以访问 Samba,然后您就可以从这个覆盖 hack^W 功能中受益。可以使用 FUSE 文件系统“bindfs”在 Linux 中配置相同的 hack。
(也就是说,mv
同一挂载文件系统上的文件夹之间的 Linux 永远不会遵循不同的默认 ACL。nautilus(GNOME 文件)也不在移动时实现默认 ACL。Windows 资源管理器会实现)。
答案2
您正在见证 Unix/Linux 权限的更微妙之处之一。当您touch
从创建文件的父目录调用命令时,将拾取 ACL 。 ACL 结合了传统权限(模式)+ ACL。
当您使用时,chmod
您仅操作正在操作的文件或目录的 MODE 位。请记住,它们是截然不同的,因此在操作它们时必须小心。
例子
如果您使用,strace
您可以看到如何chmod
工作。首先,让我们创建一个文件file_077
:
$ rm afile_077*; umask 077; strace -s 2000 touch afile_077 > afile_077.tr 2>&1
查看结果:
$ ll afile_077
-rw------- 1 user1 user1 0 Aug 7 09:32 afile_077
将文件的权限更改为a+x
:
$ strace -s 2000 chmod a+x afile_077 > afile_077_chmod.tr 2>&1
查看生成的日志:
$ cat afile_077_chmod.tr
...
umask(0) = 02
stat("afile_077", {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
fchmodat(AT_FDCWD, "afile_077", 0711) = 0
...
在这里我们可以看到正在chmod
询问umask
然后相应地设置 MODE 位。它从不关注 ACL。笔记:请记住,这种询问chmod
并不会将其输出合并umask
到其操作中。