umask 命令控制着创建文件时指定给文件的默认权限。它使用八进制表示法从文件模式属性中删除一个位掩码。
参见下面的例子:
[[email protected] cmdline]$ rm -f foo.txt [[email protected] cmdline]$ umask 0002 [[email protected] cmdline]$ touch foo.txt [[email protected] cmdline]$ ls -l foo.txt -rw-rw-r-- 1 ucm ucm 0 Oct 3 17:32 foo.txt
首先,删除 foo.txt 文件存在的所有副本,以保证一切都是重新开始。下一步,允许不带任何参数的 umask 命令,查看当前掩码值,得到的值是 0002(0022 是另一个常用的默认值),它是掩码的八进制表示形式。接着创建文件 foo.txt 的一个新实例,查看该文件的权限。
可以发现,文件所有者和组都获得了读写权限,而其他所有用户则只读权限。其他所有用户没有写权限的原因在于掩码值。重复执行该实例,不过这次是自己设置掩码值。
[[email protected] cmdline]$ rm -f foo.txt [[email protected] cmdline]$ umask 0000 [[email protected] cmdline]$ touch foo.txt [[email protected] cmdline]$ ls -l foo.txt -rw-rw-rw- 1 ucm ucm 0 Oct 3 17:38 foo.txt
在设置掩码为 0000(实际上是关闭该功能)时,可以看到其他所有用户也拥有写权限了。为了理解它是如何实现的,再来看看八进制数。如果把改掩码展开成二进制形式,然后再与属性进行对比,那么就能明白是怎么回事了。
原始文件模式 | --- rw- rw- rw- |
掩码 | 000 000 000 010 |
结果 | --- rw- rw- r-- |
在设置掩码为 0000(实际上是关闭该功能)时,可以看到其他所有用户也拥有写权限了。为了理解它是如何实现的,再来看看八进制数。如果把改掩码展开成二进制形式,然后再与属性进行对比,那么就能明白是怎么回事了。
先忽略掉掩码中前面的 0,观察掩码中出现 1 的地方,将会发现 1 的位置对应的属性被删除——在这个例子中对应的是其他所有用户的写权限。这就是掩码的操作方式。掩码的二进制数值中每个出现 1 的位置,其对应的属性都被取消。如果设置掩码值为 0022 那么具体操作如下。
原始文件模式 | --- rw- rw- rw- |
掩码 | 000 000 010 010 |
结果 | --- rw- r-- r-- |
同样地,二进制数值中 1 出现的位置,其对应的属性都被取消。可以再试一下其他的掩码值(尝试一些带数字 7 的),以熟悉掩码的操作方式。记得每次操作完之后清理文件,并把掩码值还原成默认值。
[[email protected] cmdline]$ rm -f foo.txt; umask 0002
大多数情况下,并不需要修改掩码值,系统提供的默认掩码值就很好了。然而,在一些高安全级别的环境下,则需要控制掩码值。
命令格式
umask [-p] [-S] [mode]
命令参数
-p
如果 mode 省略了,则以可复用的形式输出当前的掩码值。
-S
以字符的形式显示当前的掩码值。
实例
a) 以字符的形式显示当前的掩码值。
[[email protected] cmdline]$ umask -S u=rwx,g=rwx,o=rx