chmod、umask、acl

chmod、umask、acl

我认为答案是“这就是它的工作原理”,但我想我应该问一下,以防我做错了什么。

我的帐户的默认 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!)

umask 如何影响 ACL?

然而,它不一定是关于如何使用这些细节的良好介绍。一旦您开始想要使用默认 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到其操作中。

相关内容