linux文件权限掩码umask


我们用chmod命令可以更改文件的权限属性。但是一个文件在用chmod命令更改权限属性之前,权限属性就已经存在了。 也就是说每个文件在被创建的时候都应该有一个默认的文件权限属性。文件权限掩码umask就是用来规定默认的文件权限属性的,用来指定当前用户建立新文件或目录的默认权限值。
目录与文件的默认权限属性是不一样的。因为大部分目录都应该允许进入,可执行权限x对于目录是必要的权限! 而大部分普通文件则不应该有可执行权限,因为一般文件通常都是用来记载数据的,而不是用来执行的。 因此,默认的情况下:
普通文件默认没有可执行权限x,即只有读写权限,默认权限为-rw-rw-rw-,权限值为666
目录默认有可执行权限x,默认为所有权限均放开,默认权限为drwxrwxrwx,权限值为777
我们用cd命令切换到tmp目录,分别通过touch命令新建一个文件testfile,通过mkdir命令新建一个目录testdir,然后通过ls -ld查看新建的文件和目录的属性:

              peter@initroot:/tmp$ touch testfile
              peter@initroot:/tmp$ mkdir testdir
              peter@initroot:/tmp$ ls -ld testfile testdir
              drwxr-xr-x  2 peter peter   4096 Jan  6 20:13  testdir
              -rw-r--r--  1 peter peter      0 Jan  6 20:13  testfile
            
这里ls命令的-d选项表示,如果后面的参数是一个目录的话,只显示该目录本身的详细信息,而不是目录内文件的详细信息。
我们上面讲到,文件和目录的默认权限分别是-rw-rw-rw-和drwxrwxrwx。这里怎么变成-rw-r--r--和drwxr-xr-x了呢?
本来想法是挺简单的。但是其实上面所讲的默认值是有问题的,虽然可以适应大部分情况,但并不适合所有的用户环境。因为每个用户对文件默认权限的要求都是不一样的, 有的用户希望创建的新文件默认不被读取,而有的用户希望新文件的默认权限可以被读取修改。有的用户希望新建的目录默认可以允许进入, 但是有的用户可能不希望这样。真是众口难调啊。于是linux本着为用户服务的宗旨,让大家可以根据自己的实际需求和喜好自行设置文件和目录的默认权限属性。 我们将上面讲到的文件和目录默认权限称为原始默认权限:
普通文件原始默认权限为-rw-rw-rw-,权限值为666;
目录原始默认权限为drwxrwxrwx,权限值为777。
由于文件的原始默认权限属性无法直接修改,用户只能通过修改umaks值的方式间接修改文件的默认权限。
umask是文件权限掩码的意思,新建文件和目录的默认权限值就是在原始默认权限的基础上去掉umask值,umask值与原始默认权限共同决定了新建文件和目录的默认权限值。
可直接通过umask命令查看当前系统的umask值:
              [root@initroot ~]# umask
              0022
            
这个值看不懂?没关系,就像chmod有两种形式的权限书写形式一样, umask也有两种显示方式,以上是数字形式的umask值,我们可以通过-S(Symbolic)选项,以字符型的方式显示掩码值:
              [root@initroot ~]# umask -S
              u=rwx,g=rx,o=rx
            
umask的数值共有四位,例如上面的输出0022,四位数表示四组权限值,分别是文件特殊权限,文件所有者权限,文件所属用户组权限,其他用户权限。 这里我们先忽略掉文件特殊权限位。
umask值指的是需要从原始默认权限减掉的权限! 我们已经知道r、w、x的数值分别是4、2、1。 所以如果要去掉写权限,umask值中相应的位就是2, 如果要去掉读权限,那就是4, 去掉读与写权限,就是6, 去掉执行与写权限,就是3,去掉读与执行的权限,就是5! 而我们通过-S选项的输出u=rwx,g=rx,o=rx可以看出,u=rwx表示文件所有者权限没有去掉任何权限,对应umask相应位的数值为0, g=rx,o=rx表示文件所属用户组和其他用户去掉了w权限,对应的umaks相应位的数值就是2,所有umask的数值为0022.
这样文件的默认权限就是:
原始默认权限(-rw-rw-rw-) - umask掩码(-----w--w-) = (最终默认权限)-rw-r--r--;
目录的默认权限就是:
原始默认权限(drwxrwxrwx) - umask掩码(d----w--w-) = (最终默认权限)drwxr-xr-x
与我们上面ls -al命令的输出正好吻合:
              peter@initroot:/tmp$ touch testfile
              peter@initroot:/tmp$ mkdir testdir
              peter@initroot:/tmp$ ls -ld testfile testdir
              drwxr-xr-x  2 peter peter   4096 Jan  6 20:13  testdir
              -rw-r--r--  1 peter peter      0 Jan  6 20:13  testfile
            
所以修改umaks值就可以修改文件或者目录的默认权限属性了,那么如何设置umask值呢?
直接在umask后面输入数值就可以了。例如我希望建立的文件所属用户组默认是具有读写权限的,那么只需要在umask后面加入0002就可以了:
              root@initroot:/tmp# umask 002
              root@initroot:/tmp# touch testfile1
              root@initroot:/tmp# mkdir testdir1
              root@initroot:/tmp# ls -ld testfile1 testdir1
              drwxrwxr-x  2 root root   4096 Jan  6 20:13  testdir1
              -rw-rw-r--  1 root root      0 Jan  6 20:13  testfile1
            
假设umask为003,那么新建文件文件与目录默认权限是多少呢?
umask为003,所以去掉的权限为--------wx,因此:
文件默认权限: (-rw-rw-rw-) - (--------wx) = -rw-rw-r--
目录默认权限: (drwxrwxrwx) - (d-------wx) = drwxrwxr--Set UID,简称为 SUID 我们每次通过命令更改umask值,但是在关闭shell或者重启后,umaks又恢复到了原来的值,如果想让umask的设置值一直保留下去, 那么需要将该命令写入~/.bashrc文件中。root的umask会拿掉比较多的属性,root的umask默认是0022, 这是基于安全的考虑. 至于一般用户,默认的umask为0002,即保留用户群组的写入权限! 其实,关于默认umask的设置可以参考/etc/bashrc文件,不过,不建议修改该文件。

initroot编辑整理,转载请注明www.initroot.com

100次点赞 100次阅读