我找到了这个示例,标题为:linux中的ACL和MASK。在本文中,以下示例得到了演示,我认为这有助于理解ACL的方式以及如何umask
相互交互。
背景
在Linux系统上创建文件0666
时,将应用默认权限,而在创建目录时,0777
将应用默认权限。
示例1-文件
假设我们将umask设置为077并触摸一个文件。strace
当执行此操作时,我们可以用来查看实际发生的情况:
$ umask 077; strace -eopen touch testfile 2>&1 | tail -1; ls -l testfile
open("testfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3
-rw-------. 1 root root 0 Sep 4 15:25 testfile
在此示例中,我们可以看到系统调用open()
是使用权限0666进行的,但是当umask 077
内核随后应用时,将删除以下权限(---rwxrwx
),rw-------
也就是0600。
示例-2目录
可以将相同的概念应用于目录,除了默认权限为0777而不是默认权限为0666。
$ umask 022; strace -emkdir mkdir testdir; ls -ld testdir
mkdir("testdir", 0777) = 0
drwxr-xr-x 2 saml saml 4096 Jul 9 10:55 testdir
这次我们使用mkdir
命令。mkdir
然后,该命令称为系统调用mkdir()
。在上面的示例中,我们可以看到该mkdir
命令mkdir()
以默认权限0777
(rwxrwxrwx
)调用了系统调用。这次022
删除了以下权限的umask (----w--w-
),因此在rwxr-xr-x
创建目录时,我们只剩下0755()。
示例3(应用默认ACL)
现在让我们创建一个目录,并演示将默认ACL应用于其中的文件以及其中的文件时会发生什么。
$ mkdir acldir
$ sudo strace -s 128 -fvTttto luv setfacl -m d:u:nginx:rwx,u:nginx:rwx acldir
$ getfacl --all-effective acldir
# file: acldir
# owner: saml
# group: saml
user::rwx
user:nginx:rwx #effective:rwx
group::r-x #effective:r-x
mask::rwx
other::r-x
default:user::rwx
default:user:nginx:rwx #effective:rwx
default:group::r-x #effective:r-x
default:mask::rwx
default:other::r-x
现在让我们创建文件aclfile
:
$ strace -s 128 -fvTttto luvly touch acldir/aclfile
# view the results of this command in the log file "luvly"
$ less luvly
现在获得新创建文件的权限:
$ getfacl --all-effective acldir/aclfile
# file: acldir/aclfile
# owner: saml
# group: saml
user::rw-
user:nginx:rwx #effective:rw-
group::r-x #effective:r--
mask::rw-
other::r--
注意面罩mask::rw-
。为什么它mask::rwx
不像创建目录时那样?
检查luvly
日志文件以查看用于文件创建的默认权限:
$ less luvly |grep open |tail -1
10006 1373382808.176797 open("acldir/aclfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3 <0.000060>
这有点令人困惑。将掩码设置为rwx
创建目录时,您希望创建文件时具有相同的行为,但这种方式行不通。这是因为内核open()
使用默认权限调用函数0666
。
总结一下
- 文件不会获得执行许可(屏蔽或有效)。不管使用哪种方法:ACL,umask或mask&ACL。
- 目录可以获取执行权限,但这取决于设置屏蔽字段的方式。
- 设置ACL权限下的文件的执行权限的唯一方法是使用手动设置它们
chmod
。
参考文献
mask::rw-
。但这不是您真正的问题,对吗?