Ala*_*orm 24 permissions umask
如果我将 更改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
Run Code Online (Sandbox Code Playgroud)
也就是说,省略了执行权限,我最终得到rw-rw-rw-
了文件(目录是rwxrwxrwx
)。我在本地 OS X 机器、共享主机上的旧 BSD 机器和在 linode 上运行的 linux 服务器上尝试了这个。
为什么是这样?我的理解是 umask 是权限的最终仲裁者——我对此的理解不正确吗?如果是这样,还有什么会影响 unix 系统上文件的默认权限?
Ste*_*itt 32
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;但这只是文档默认值(即,在读取 POSIX 时,如果程序或函数未指定文件或目录的模式,则应用默认值),并且不会由系统强制执行。一般来说,这意味着符合 POSIX 的工具在创建文件时指定模式 666,创建目录时指定模式 777,并从中减去 umask;但系统无法强制执行此操作,因为使用其他模式和/或忽略 umask 有许多正当理由:
chmod(1)
显然根据其参数指定模式,并且在指定“who”或完全指定模式时chmod o+x
忽略 umask (因此忽略 umask,与 一样chmod 777
,但chmod +w
应用 umask);cp -p
, tar -p
;install --mode
, mknod -m
...因此,您应该将 umask 视为指定您不希望看到的默认设置的权限位,但请注意,这只是一个请求。你不能用它来指定你想看到设置的权限位,只有那些你想看到未设置的。此外,任何进程都可以使用umask(2)
系统调用更改其 umask !该umask(2)
系统调用也是一个过程,找出其当前的umask(从其父继承)的唯一POSIX定义的方式。在Linux上,从内核4.7,你可以看到一个进程的当前的umask寻找Umask
在/proc/${pid}/status
。
(为了完整起见,我会提到有关setuid
,setgid
和粘滞位的行为是系统相关的,并且 NFS 等远程文件系统可以添加自己的曲折。)
计算文件权限的公式:
default_mode & ~umask
Run Code Online (Sandbox Code Playgroud)
也由 POSIX 指定,文件的默认模式是S_IROTH | S_IWOTH | S_IRGRP | S_IWGRP | S_IRUSR | S_IWUSR
or 666
,目录的默认模式是S_IRWXU | S_IRWXG | S_IRWXO
or777
如果它不是由应用程序指定的。
因为当文件默认模式下的0
执行位是 时,执行按位&
与0
总是0
。
这就是为什么无论 是什么值umask
,如果您的应用程序没有指定执行位,您新创建的文件都会关闭执行位。