umask 命令
使用 umask 默认权限来给所有新建的文件和目录赋予初始权限的。
直接通过 umask 命令:
[root@localhost ~]# umask
0022
#root用户默认是0022,普通用户默认是 0002
umask 默认权限确实由 4 个八进制数组成,但第 1 个数代表的是文件所具有的特殊权限(SetUID、SetGID、Sticky BIT),此部分内容放到后续章节中讲解,现在先不讨论。也就是说,后 3 位数字 "022" 才是本节真正要用到的 umask 权限值,将其转变为字母形式为 ----w--w-。
注意:虽然 umask 默认权限是用来设定文件或目录的初始权限,但并不是直接将 umask 默认权限作为文件或目录的初始权限,还要对其进行 "再加工"。
文件和目录的真正初始权限,可通过以下的计算得到:
文件(或目录)的初始权限 = 文件(或目录)的最大默认权限 - umask权限
如果按照官方的标准算法,需要将 umask 默认权限使用二进制并经过逻辑与和逻辑非运算后,才能得到最终文件或目录的初始权限,计算过程比较复杂,且容易出错,因此本节给大家介绍了更简单的计算方式。
显然,如果想最终得到文件或目录的初始权限值,我们还需要了解文件和目录的最大默认权限值。在 Linux 系统中,文件和目录的最大默认权限是不一样的:
接下来,利用字母权限的方式计算文件或目录的初始权限。以 umask 值为 022 为例,分别计算新建文件和目录的初始权限:
文件的最大默认权限是 666,换算成字母就是 "-rw-rw-rw-",umask 的值是 022,换算成字母为 "-----w--w-"。把两个字母权限相减,得到 (-rw-rw-rw-) - (-----w--w-) = (-rw-r--r--),这就是新建文件的初始权限。测试一下:
[root@localhost ~]# umask
0022
#默认umask的值是0022
[root@localhost ~]# touch file <--新建file空文件
[root@localhost ~]# ll -d file
-rw-r--r--. 1 root root 0 Apr 18 02:36 file
目录的默认权限最大可以是 777,换算成字母就是 "drwxrwxrwx",umask 的值是 022,也就是 "-----w--w-"。把两个字母权限相减,得到的就是新建目录的默认权限,即 (drwxrwxrwx) - (-----w--w-) = (drwxr-xr-x)。我们再来测试一下:
[root@localhost ~]# umask
0022
[root@localhost ~]# mkdir catalog <--新建catalog目录
[root@localhost ~]# ll -d catalog
drwxr-xr-x. 2 root root 4096 Apr 18 02:36 catalog
最大默认权限中和 umask 权限公共的部分,通过减法运算会被遮盖掉,最终剩下的“最大默认权限”,才是最终赋予文件或目录的初始权限。
umask默认权限的修改方法
umask 权限值可以通过如下命令直接修改:
[root@localhost ~]# umask 002
[root@localhost ~]# umask
0002
[root@localhost ~]# umask 033
[root@localhost ~]# umask
0033
不过,这种方式修改的 umask 只是临时有效,一旦重启或重新登陆系统,就会失效。如果想让修改永久生效,则需要修改对应的环境变量配置文件 /etc/profile。例如:
[root@localhost ~]# vim /etc/profile
...省略部分内容...
if [ $UID -gt 199]&&[ "'id -gn'" = "'id -un'" ]; then
umask 002
#如果UID大于199(普通用户),则使用此umask值
else
umask 022
#如果UID小于199(超级用户),则使用此umask值
fi
…省略部分内容…
这是一段 Shell 脚本程序,不懂也没关系,只要知道,普通用户的 umask 由 if 语句的第一段定义,而超级用户 root 的 umask 值由 else 语句定义即可。 修改此文件,则 umask 值就会永久生效。