有人可以向我解释一下umask
如果激活 ACL 会如何影响新创建文件的默认掩码吗?有关于这方面的一些文档吗?
例子:
$ mkdir test_dir && cd test_dir
$ setfacl -m d:someuser:rwx -m u:someuser:rwx . # give access to some user
$ getfacl .
# file: .
# owner: myUsername
# group: myGroup
user::rwx
user:someuser:rwx
group::---
mask::rwx
other::---
default:user::rwx
default:user:someuser:rwx
default:group::---
default:mask::rwx
default:other::---
$ umask # show my umask
077
$ echo "main(){}" > x.c # minimal C program
$ make x # build it
cc x.c -o x
$ getfacl x
# file: x
# owner: myUsername
# group: myGroup
user::rwx
user:someuser:rwx #effective:rw-
group::---
mask::rw-
other::---
我预计mask:rwx
。实际上,在设置umask
为例如之后027
,我得到了预期的行为。
答案1
我找到了这个例子,标题为:Linux中的ACL和MASK。在本文中,演示了以下示例,我认为这些示例有助于理解 ACL 和umask
ACL 之间如何交互。
背景
在 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 目录
同样的概念也适用于目录,只不过默认权限不是 0666,而是 0777。
$ 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-
我们留下 0755 ( )。rwxr-xr-x
示例 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
。
参考
答案2
出于安全目的,Linux 操作系统不允许自动创建具有执行位的文件。这是为了防止网络攻击者将程序写入此类文件并在获得对您服务器的访问权限时执行它们。这只是一个安全预防措施。使用 chmod 实用程序创建文件后,您将永远必须手动设置文件的执行位