如果我将 更改为umask
,0000
我希望创建一个具有rwxrwxrwx
权限的文本文件(根据我对 umask 的理解,如“可能重复”问题中所述)但是,当我尝试这个时,我得到以下结果
$ umask 0000
$ touch /tmp/new.txt
$ ls -ld /tmp/new.txt
-rw-rw-rw- 1 alanstorm wheel 0 Jun 2 10:52 /tmp/new.txt
也就是说,省略了执行权限,最终得到了rw-rw-rw-
for 文件(目录是rwxrwxrwx
)。我在本地 OS X 机器、共享主机上的一台旧 BSD 机器以及在 linode 上运行的 Linux 服务器上尝试了此操作。
为什么是这样?我的理解是 umask 是权限的最终仲裁者——我对此的理解是否正确?如果是这样,还有什么会影响 UNIX 系统上文件的默认权限?
答案1
umask 是减法的,而不是规定性的:默认情况下,从程序指定的模式中删除 umask 中设置的权限位,但 umask 不能添加权限位。touch
默认指定模式 666(链接指向 GNU 实现,但其他的行为方式相同;这是由 POSIX 指定),因此生成的文件最终会被当前的umask
: 屏蔽,在您的情况下,因为umask
没有屏蔽任何内容,所以结果是 666。
文件或目录的模式通常由创建它的程序指定;大多数涉及的系统调用都采用一种模式(例如 open(2)
,creat(2)
,mkdir(2)
都有一个模式参数;但fopen(2)
没有,并使用模式 666)。除非父目录指定了默认ACL,否则调用时进程的umask用于屏蔽指定的模式(按位mode & ~umask
;有效地从模式中减去umask中的每组权限),因此umask只能减少一个模式,无法增加。如果父目录指定了默认 ACL,则使用该默认 ACL 代替 umask:生成的文件权限是创建程序指定的模式与默认 ACL 指定的模式的交集。
POSIX 指定文件的默认模式应为 666,目录的默认模式应为 777;但这只是一个文档默认 (IE,在读取 POSIX 时,如果程序或函数未指定文件或目录的模式,则应用默认值),并且系统不强制执行。一般来说,这意味着 POSIX 兼容工具在创建文件时指定模式 666,在创建目录时指定模式 777,并从中减去 umask;但系统无法强制执行此操作,因为有许多合理的理由使用其他模式和/或忽略 umask:
- 创建可执行文件的编译器尝试生成一个设置了可执行位的文件(尽管它们确实应用了 umask);
chmod(1)
显然,根据其参数指定模式,并且当指定“who”或完全指定模式时,它会忽略 umask(因此chmod o+x
会忽略 umask,与 一样chmod 777
,但chmod +w
应用 umask);- 保留权限的工具应用适当的模式并忽略 umask:例如
cp -p
,tar -p
; - 采用完全指定模式的参数的工具也会忽略 umask:
install --mode
,mknod -m
...
因此,您应该将 umask 视为指定您不希望看到默认设置的权限位,但请注意这只是一个请求。您不能使用它来指定您希望看到设置的权限位,只能使用它来指定您希望看到未设置的权限位。此外,任何进程都可以更改其 umask,使用umask(2)
系统调用!系统umask(2)
调用也是进程查找其当前 umask(从其父进程继承)的唯一 POSIX 定义方法。在 Linux 上,从内核 4.7 开始,您可以通过以下方式查看进程的当前 umask寻找Umask
在/proc/${pid}/status
。
(为了完整起见,我将提到有关setuid
、setgid
和粘性位的行为取决于系统,并且 NFS 等远程文件系统可以添加自己的变化。)
答案2
文件权限计算公式:
default_mode & ~umask
也由 POSIX 指定,文件的默认模式是S_IROTH | S_IWOTH | S_IRGRP | S_IWGRP | S_IRUSR | S_IWUSR
or 666
,目录的默认模式是S_IRWXU | S_IRWXG | S_IRWXO
or777
如果应用程序未指定。
因为当文件默认模式下的执行位为 时0
,总是与 is执行按位&
与。0
0
这就是为什么无论 的值是什么umask
,如果您的应用程序未指定执行位,您新创建的文件都将关闭执行位。
答案3
上面的描述非常好。它提供了 umask 和权限的清晰描述。更实用一点,如果你想看看“touch”提供的权限是做什么的
“ strace touch /tmp/new.txt ”
观察 touch 用于创建“new.txt”的系统调用
对于前。 “strace touch /tmp/new.txt”的 o/p(... -> 一些内容)
...
打开(“/tmp/new.txt”,O_WRONLY | O_CREAT | O_NOCTTY | O_NONBLOCK,0666)= 3
...
以供参考 斯特雷斯