umask
*nix 操作系统中命令的实际用途是什么?
其工作机制和用途如何?例如
$ umask 022
之前非常感谢
答案1
umask
是大多数 shell 的内置命令,它只是系统调用的接口umask()
,您可以在 shell 的文档中找到它的描述(注意man umask
可能会指向umask()
系统调用的文档或umask
shell 的内置命令的文档)除了你的以外)。
用户掩码是进程的一个属性(从父进程继承到子进程并在命令执行时保留),用于确定创建文件时默认自动授予文件的权限。
该umask
实用程序允许您设置 shell 进程的用户掩码,以控制 shell 会话中运行的任何命令创建的文件的权限。
所有 shell的 都umask
将掩码视为八进制数,而在某些 shell(包括所有 POSIX shell)上,它也可以以符号形式指定,例如 for chmod
。
掩码决定了权限的哪些位应该是清除当文件被创建时。例如umask 777
,其中 0777 是 511 或 0b111_111_111 将导致在没有权限的情况下创建文件,因为 Unix 文件权限的所有 91 位(3(r
读取、w
写入、执行x
)用户, 3 为团体, 3 为其他)将被清除。
符号形式指定哪些位应该不是被清除。也会umask 777
如此umask u=,g=,o=
。
一般来说,您至少希望 umask 包含w
其他位,o
因为您不希望您创建的文件是全局可写的(umask 002
或umask u=rwx,g=rwx,o=rx
)。
您可能希望至少在用户的主要组不是个人组(与其他用户共享)的系统上也设置w
组位:或。g
umask 022
umask u=rwx,g=rx,o=rx
Aumask 077
或umask u=rwx,g=,o=
确保您创建的所有文件都是您私有的(其他任何人都无法访问)。您经常在创建临时文件的脚本中看到这一点,有时在子 shell 中,如下所示:
(umask 077; echo test > "$tmpfile")
设置umask
服务器位u
可能会导致问题,因为您最终可能会创建甚至无法打开的文件。
请注意,应用了用户掩码在上面open()
应用程序或creat()
文件所请求的权限。如果他们在is ( )creat("file", 0666)
时这样做,则权限最终将为( )。应用程序仍然可以调用或之后根据需要更改权限(并且 umask 在那里不起作用)。umask
022
u=rwx,g=rx,o=rx
0644
u=rw,g=r,o=r
fchmod()
chmod()
umask
不带参数以八进制形式报告当前用户掩码。umask -S
在某些 shell 中以符号形式报告它。umask -p
或输出 shell 代码bash
,fish
该代码一旦解释就会设置相同的用户掩码。
修改后可用于恢复之前的 umask:
previous_umask=$(umask)
umask 077
# create some private files
umask "$previous_umask"
1 从技术上讲,有 12 位权限,其中 3 个额外的权限是特殊位,根据文件类型用于各种目的,有时与其他权限位结合使用(例如用于可执行文件的 setuid、setgid 位、t
用于目录的位.. .)。在某些系统上,当在open()
/中请求时,这些位会被忽略creat()
,无论如何,当它们由应用程序设置时(通常是通过chmod()
之后),这是有充分理由的,因此将它们包含在 / 中通常没有用,umask
并且umask()
系统调用将忽略它们反正。