序言
我们有没有思索过一个问题,在登陆Linux系统后,我们创建的目录或则文件的权限,为何每次创建都是统一的?我们做以下实验:新建一个用户userA,之后分别创建目录dir01和dir02linux vps,文件t1.txt和t2.txt。
[root@linux01 ~]# useradd userA
[root@linux01 ~]# su - userA
[userA@linux01 ~]$ ll
total 0
[userA@linux01 ~]$ mkdir dir01
[userA@linux01 ~]$ mkdir dir02
[userA@linux01 ~]$ touch t1.txt
[userA@linux01 ~]$ touch t2.txt
[userA@linux01 ~]$ ll
total 8
drwxr-x--- 2 userA userA 4096 Mar 27 10:25 dir01
drwxr-x--- 2 userA userA 4096 Mar 27 10:25 dir02
-rw-r----- 1 userA userA 0 Mar 27 10:25 t1.txt
-rw-r----- 1 userA userA 0 Mar 27 10:25 t2.txt
从上述的实验中发觉,每次创建目录的权限都是drwxr-x---,即为750,文件的权限都是-rw-r-----即为640。我们能想到的必将这是个默认权限,那这个默认权限由谁来控制?答案是:umask。
[userA@linux01 ~]$ umask
0027
是的,我们可以通过umask来改变用户的创建文件和目录的默认权限,Linux是讲求安全性的OS,而安全离不开权限的设置,对于创建新的目录和文件设定必要的初始权限是必不可少的linux给用户分配权限linux给用户分配权限,Linux和Windows在权限一个很大的区别就是:Windows中,新建目录和文件是承继上级目录权限;Linux是通过使用umask设置的默认权限给新建的目录和文件赋于初始权限。下边将一起走入umask的学习和使用。
umaskumask介绍
首先,我们要了解的是,Linux文件的最大权限是666,目录的最大权限是777,为什么目录要比文件权限大?由于目录须要有执行权(x)才才能步入到目录中。
umask的作用是在用户登陆Linux系统环境下,设置用户创建目录和文件的初始化权限。
umask命令
句型:
[userA@linux01 ~]$ umask -p
umask 0027
[userA@linux01 ~]$ umask -S
u=rwx,g=rx,o=
[userA@linux01 ~]$ umask u=rw
[userA@linux01 ~]$ umask -p -S
umask -S u=rw,g=rx,o=
[userA@linux01 ~]$ umask -p
umask 0127
[userA@linux01 ~]$ umask u=rwx
[userA@linux01 ~]$ umask -p
umask 0027
[userA@linux01 ~]$ umask o=x
[userA@linux01 ~]$ umask -p
umask 0026
[userA@linux01 ~]$ umask -p -S
umask -S u=rwx,g=rx,o=x
umask储存位置
通常umask的值可以在/etc/profile文件中定义。
# By default, we want umask to get set. This sets it for login shell
# Current threshold for system reserved uid/gids is 200
# You could check uidgid reservation validity in
# /usr/share/doc/setup-*/uidgid file
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002
else
umask 022
fi
··· ···
··· ···
umask 027
其中,我们可以看见帐号UID>199且UID=GID且用户名=用户组名时,umask值为002,否则,umask值为022。
umask027表示当前用户的umask网段值设置为027。
umask值估算
里面仍然在讲umask网段值,那这个值到底如何估算?或则说,这个网段值和目录或文件的默认权限关系是如何的?
[userA@linux01 ~]$ umask
0027
我们通过umask命令获取到当前用户的umask网段值为0027,为什么是4位?虽然真正有效的是后3位。第1位是代表文件所具有的特殊权限(SetUID、SetGID、StickyBIT)。
通过umask值我们可以反推出用户新建目录和文件的默认权限是哪些。
原理将目录或文件的默认最高权限(目录777、文件666)和umask网段值都转换为二补码。对umask取反。将两个二补码值做与运算。将与运算后的二补码值转换为十补码,即为用户的新建目录或文件的默认权限。示例
目录场景:
估算默认权限:
转为二补码:
777=0
022=0umask取反
NOT运算:1与运算
0总权限777
1umask取反
====================
0新建目录默认权限转为十补码
0=755
即该用户新建目录的默认权限为755,即为rwxr-xr-x。
文件场景:
估算默认权限:
转为二补码:
666=0
022=0umask取反
NOT运算:1与运算
0总权限666
1umask取反
====================
0新建目录默认权限转为十补码
0=644
即该用户新建目录的默认权限为644,即为rw-r--r--。公式
根据umask估算的原理很麻烦,所以弄一个公式来总结估算如下:
而这些公式形式须要注意分类:
示例
对照原理示例umask值=022,估算如下:
用户目录默认权限:777-022=755,即为rwxr-xr-x。
用户文件默认权限:666-022=644,即为rw-r--r--。
对照序言中的实验umask值=027,估算如下:
用户目录默认权限:777-027=750,即为drwxr-x---。
用户文件默认权限:666-027+1=640,即为-rw-r-----。
umask值更改暂时更改
暂时更改的形式,可以通过umask命令来修改,例如估算出权限对应的umask值要改为027,则直接用该用户登入Linux系统后,使用命令umask027即可。并且,一旦用户退出登入后,umask将恢复默认值,刚刚设置的将会失效。所以,这些umask命令形式,只是适宜当前会话。
永久更改
不仅使用umask命令进行当前会话的用户默认权限设置外,我们还可以对该用户永久性更改umask值。针对某个用户更改,须要用该用户登入Linux,之后更改/etc/profile文件中的umask值。
更改前:
[userA@linux01 ~]$ umask
0027
[userA@linux01 ~]$ vim /etc/profile
更改后:
[userA@linux01 ~]$ vim /etc/profile
[userA@linux01 ~]$ umask
0022
[userA@linux01 ~]$ mkdir dir03
[userA@linux01 ~]$ touch t3.txt
[userA@linux01 ~]$ ll
total 12
drwxr-x--- 2 userA userA 4096 Mar 27 10:25 dir01
drwxr-x--- 2 userA userA 4096 Mar 27 10:25 dir02
drwxr-xr-x 2 userA userA 4096 Mar 27 21:48 dir03
-rw-r----- 1 userA userA 0 Mar 27 10:25 t1.txt
-rw-r----- 1 userA userA 0 Mar 27 10:25 t2.txt
-rw-r--r-- 1 userA userA 0 Mar 27 21:48 t3.txt
显著可以看出更改后,新建目录和文件的权限早已发生变化。
总结
假如我们登录Linux系统后linux命令行,新建目录或则文件好多,且权限都是某种特定的,则可以通过umask命令来暂时设置当前会话的默认权限。假如后期须要永久性的可以更改/etc/profile中的umask值。
其实,对于应用程序一些吐文件时须要先新建的目录或则文件设置权限时,我们为了安全方法,可能不能永久性更改umask值,但,我们可以在启动脚本上面加上umask022这些命令,来促使当前应用启动时遭到当前启动脚本中的umask来控制应用程序输出的文件或目录的默认权限。