天天看点

linux创建文件包括权限,Linux umask详解:令新建文件和目录拥有默认权限

umask 默认权限是 Linux 权限的一种,主要用于让 Linux 中的新建文件和目录拥有默认权限。Linux 是一个比较安全的操作系统,而安全的基础就是权限,所以,在 Linux 中所有的文件和目录都要有基本的权限,新建的文件和目录当然也要有默认的权限。

在 Linux 中,通过 umask 默认权限来给所有新建立的文件和目录赋予初始权限,这一点和 Windows 不太一样,Windows 是通过继承上级目录的权限来给文件和目录赋予初始权限的。

[[email protected] ~]# umask

0022

#用八制数值显示umask权限

[[email protected] ~]# umask -S

u=rwx, g=rx, o=rx

#用字母表示文件和目录的初始权限

使用"-S"选项,会直接用字母来表示文件和目录的初始权限。我们査看数值的 umask 权限,看到的是 4 位数字"0022",其中第一个数字"0"代表的是文件的特殊权限(SetUID、SetGID、Sticky BIT),特殊权限我们放在后续章节来详细讲解,现在先不讨论。也就是后 3 位数字"022"才是真正的 umask 默认权限。

umask默认权限的计算方法

在学习 umask 默认权限的计算方法之前,我们需要先了解一下新建文件和目录的默认最大权限。

对文件来讲,新建文件的默认最大权限是 666,没有执行(x)权限。这是因为执行权限对文件来讲比较危险,不能在新建文件的时候默认赋予,而必须通过用户手工赋予。

对目录来讲,新建目录的默认最大权限是 777。这是因为对目录而言,执行(x)权限仅仅代表进入目录,所以即使建立新文件时直接默认赋予,也没有什么危险。

接下来我们学习如何计算 umask 默认权限。按照官方的标准算法,umask 默认权限需要使用二进制进行逻辑与和逻辑非联合运算才可以得到正确的新建文件和目录的默认权限。这种方法既不好计算,也不好理解,笔者并不推荐。

我们在这里还是按照权限字母来讲解 umask 权限的计算方法。我们就按照默认的 umask 值是 022 来分别计算一下新建文件和目录的默认权限吧。

文件的默认权限最大只能是 666,换算成字母就是"-rw-rw-rw-";而 umask 的值是 022,也换算成字母就是"-----w–w-"。把两个字母权限相减,得到的就是新建文件的默认权限:(-rw-rw-rw-) - (-----w–w-)=(-rw-r–r--)。

目录的默认权限最大可以是 777,换算成字母就是"drwxrwxrwx";而 umask 的值是022,也换算成字母就是"d----w–w-"。也把两个字母权限相减,得到的就是新建目录的默认权限:(drwxrwxrwx) - (d----w–w-)=(drwx-r-xr-x)。

[[email protected] ~]# umask 0022

#默认umask的值是0022

[[email protected] ~]# touch laowang

[[email protected] ~]# mkdir fengjie

[[email protected] ~]# ll -d laowang fengjie/

drwxr-xr-x 2 root root 4096 6月 16 02:36 fengjie/ -rw-r--r-- 1 root root 0 6月 16 02:36 laowang

#新建立目录的默认权限是755,新建立文件的默认权限是644

注意,这里强调一下,umask 默认权限的计算是不能直接使用数字相减的。很多人会理解为,既然文件的默认权限最大是"666",umask 的值是"022",而新建文件的值刚好是"644",那是不是就是直接使用"666-644"呢?

这是不对的,如果 umask 的值是"033"呢?按照数值相减,就会得到"633"的值。但是我们强调过文件是不能在新建立时就拥有执行(x)权限的,而权限"3"是包含执行(x)权限的。我们测试一 下:

[[email protected] ~]# umask 033

#修改umask的值为033

[[email protected] ~]# touch xuejie

#建立测试文件xuejie

[[email protected] ~]# ll xuejie

-rw-r--r-- 1 root root 0 6月 16 02:46 xuejie

#xuejie文件的默认权限依然是644

由这个例子我们可以知道,umask 默认权限一定不是使用权限数字相减得到的,而是通过二进制逻辑与和逻辑非联合运算得到的。最简单的办法还是使用权限字母来计算。

文件的默认权限最大只能是 666,换算成字母就是"-rw-rw-rw-";而 umask 的值是 033,也换算成字母就是"-----wx-wx"。把两个字母权限相减,得到的就是新建文件的默认权限:(-rw-rw-rw-)-(-----wx-wx)=(-rw-r–r--)。

umask 默认权限的修改方法

umask 默认权限可以直接通过命令来进行修改,例如:

[[email protected] ~]# umask 002

[[email protected] ~]# umask 033

不过,通过命令进行的修改只能临时生效,一旦重启或重新登录就会失效。如果想让修改永久生效,则需要修改对应的环境变量配置文件 /etc/profile。例如:

[[email protected] ~]# vi /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 语句的第一段定义,而超级用户的 umask 值由 else 语句定义即可。 如果修改的是这个文件,则 umask 值是永久生效的。

我们学习了文件的基本权限和 umask 默认权限这两种权限,但是 Linux 的权限并不只有这两种,其他的权限内容我们会在后续章节中介绍,这里就不一一列举了。