3.2.7 默认权限和umask

既然说Linux系统对每个文件都有严格的权限控制,但是似乎到目前为止书中还并没有太细致地设置文件权限,而且在新创建文件的时候,也没有特意设置过权限。事实上,所有的文件在创建时就都是有权限的了,那么这些权限是怎么来的呢?也许你会想到是系统采用了默认权限的方法,也就是当我们创建文件的时候,系统套用默认权限来设置了文件。下面使用root用户登录系统来看一下:


  1. [root@localhost tmp]# touch root_file1
  2. [root@localhost tmp]# touch root_file2
  3. [root@localhost tmp]# ls -l root_file1
  4. -rw-r--r-- 1 root root 0 Jan 5 18:48 root_file1
  5. [root@localhost tmp]# ls -l root_file2
  6. -rw-r--r-- 1 root root 0 Jan 5 18:52 root_file2
  7. [root@localhost tmp]# mkdir root_dir1
  8. [root@localhost tmp]# mkdir root_dir2
  9. [root@localhost tmp]# ls -ld root_dir1
  10. drwxr-xr-x 2 root root 4096 Jan 5 18:54 root_dir1
  11. [root@localhost tmp]# ls -ld root_dir2
  12. drwxr-xr-x 2 root root 4096 Jan 5 18:54 root_dir2

注意,创建的root_file1、root_file2文件的权限都是644;创建的root_dir1、root_dir2目录的权限都是755。到这里似乎可以得出一个结论:文件的权限默认是644,目录的默认权限是755。但是实际情况是这样的吗?让我们使用普通用户john来操作一下,如下所示:


  1. [john@localhost tmp]$ touch john_file1
  2. [john@localhost tmp]$ touch john_file2
  3. [john@localhost tmp]$ ls -l john_file1
  4. -rw-rw-r-- 1 john john 0 Jan 5 19:00 john_file1
  5. [john@localhost tmp]$ ls -l john_file2
  6. -rw-rw-r-- 1 john john 0 Jan 5 19:00 john_file2
  7. [john@localhost tmp]$ mkdir john_dir1
  8. [john@localhost tmp]$ mkdir john_dir2
  9. [john@localhost tmp]$ ls -ld john_dir1
  10. drwxrwxr-x 2 john john 4096 Jan 5 19:00 john_dir1
  11. [john@localhost tmp]$ ls -ld john_dir2
  12. drwxrwxr-x 2 john john 4096 Jan 5 19:00 john_dir2

这里创建的john_file1、john_file2文件的权限都是664;创建的john_dir1、john_dir2目录的权限都是775。

可以给出一个结论:对于root用户,文件的默认权限是644,目录的默认权限是755;对于普通用户,文件的默认权限是664,目录的默认权限是775。到这里似乎可以结束关于默认权限的讨论了。但是,有两个疑问请读者考虑一下:

·这个默认权限是从哪里来的呢?

·为什么root用户和普通用户的默认权限不同呢?

要想回答上面的问题,就需要引入umask概念,中文翻译为:遮罩。在Linux下,定义目录创建的默认权限的值是“umask遮罩777后的权限”,定义文件创建的默认权限是“umask遮罩666后的权限”。

系统在/etc/profile文件中,通过第51行至55行的一段代码设置了不同用户的遮罩值。


  1. if [ $UID -gt 99 ] && [ "`id -gn`" = "`id -un`" ]; then
  2. umask 002
  3. else
  4. umask 022
  5. fi

从上面的代码中可以看出,UID大于99的用户设置了umask为002,否则为022。所以umask值对于root用户是022,对于普通用户是002,这也就造成了上面我们看到的root用户和普通用户创建出来的文件和目录默认权限不一样,那么如何使用遮罩计算权限呢?

777用字符串表示为:rwxrwxrwx,如果遮罩值是022,用字符串表示为:——w—w-,那么前者第五位和第八位的w被遮罩掉,权限变为rwxr-xr-x,用数字表示就是755。如果遮罩值是002,用字符串表示为:———-w-,那么第八位的w被遮罩掉,权限变为rwxrwxr-x,用数字表示就是775。

666用字符串表示为:rw-rw-rw-,如果遮罩值是022,用字符串表示为:——w—w-,那么前者第五位和第八位的w被遮罩掉,权限变为rw-r—r—,用数字表示就是644。如果遮罩值是002,用字符串表示为:———-w-,那么第八位的w被遮罩掉,权限变为rw-rw-r—,用数字表示就是664。

特别强调一下,网络上有很多关于计算umask遮罩后权限值的讲解,比较主流但是错误的讲解方式是使用“同位相减”的做法来计算遮罩后的值,比如说777-022同位相减得到755,666-022同位相减得到644,这种看似正确的结果其实只是一种巧合,并不是了解遮罩的正确方式。假设有个文件的权限为666,在遮罩值为011的情况下,采用该“同位相减”的方法计算出的权限值为655,但实际上正确的权限值应该是666。这点请读者注意。