现在你已经了解了用户和组,是时候解读ls命令输出时所出现的谜一般的文件权限了。本节
将会介绍如何对权限进行分析以及它们的来历。

7.3.1 使用文件权限符

如果你还记得第3章,那应该知道ls命令可以用来查看Linux系统上的文件、目录和设备的权限。

$ ls –l
total 68
-rw-rw-r— 1 rich rich 50 2010-09-13 07:49 file1.gz
-rw-rw-r— 1 rich rich 23 2010-09-13 07:50 file2
-rw-rw-r— 1 rich rich 48 2010-09-13 07:56 file3
-rw-rw-r— 1 rich rich 34 2010-09-13 08:59 file4
-rwxrwxr-x 1 rich rich 4882 2010-09-18 13:58 myprog
-rw-rw-r— 1 rich rich 237 2010-09-18 13:58 myprog.c
drwxrwxr-x 2 rich rich 4096 2010-09-03 15:12 test1
drwxrwxr-x 2 rich rich 4096 2010-09-03 15:12 test2
$

输出结果的第一个字段就是描述文件和目录权限的编码。这个字段的第一个字符代表了对象的类型:

    • 代表文件
  • d 代表目录
  • l 代表链接
  • c 代表字符型设备
  • b 代表块设备
  • n 代表网络设备之后有3组三字符的编码。每一组定义了3种访问权限:
  • r 代表对象是可读的
  • w 代表对象是可写的
  • x 代表对象是可执行的若没有某种权限,在该权限位会出现单破折线。这3组权限分别对应对象的3个安全级别:
  • 对象的属主
  • 对象的属组
  • 系统其他用户

image.png
讨论这个问题的最简单的办法就是找个例子,然后逐个分析文件权限。
-rwxrwxr-x 1 rich rich 4882 2010-09-18 13:58 myprog

  • rwx:文件的属主(设为登录名rich)。
  • rwx:文件的属组(设为组名rich)。
  • r-x:系统上其他人。

7.3.2 默认文件权限

你可能会问这些文件权限从何而来,答案是umask。umask命令用来设置所创建文件和目录
的默认权限。

$ touch newfile
$ ls -al newfile
-rw-r—r— 1 rich rich 0 Sep 20 19:16 newfile
$

touch命令用分配给我的用户账户的默认权限创建了这个文件。umask命令可以显示和设置
这个默认权限。

$ umask
0022
$

遗憾的是,umask命令设置没那么简单明了,想弄明白其工作原理就更混乱了。第一位代表
了一项特别的安全特性,叫作粘着位(sticky bit)。这部分内容会在7.5节详述。

后面的3位表示文件或目录对应的umask八进制值。要理解umask是怎么工作的,得先理解
八进制模式的安全性设置。

八进制模式的安全性设置先获取这3个rwx权限的值,然后将其转换成3位二进制值,用一个
八进制值来表示。在这个二进制表示中,每个位置代表一个二进制位。因此,如果读权限是唯一
置位的权限,权限值就是r—,转换成二进制值就是100,代表的八进制值是4。表7-5列出了可
能会遇到的组合。
image.png

八进制模式先取得权限的八进制值,然后再把这三组安全级别(属主、属组和其他用户)的
八进制值顺序列出。因此,八进制模式的值664代表属主和属组成员都有读取和写入的权限,而
其他用户都只有读取权限。

了解八进制模式权限是怎么工作的之后,umask值反而更叫人困惑了。我的Linux系统上默
认的八进制的umask值是0022,而我所创建的文件的八进制权限却是644,这是如何得来的呢?

umask值只是个掩码。它会屏蔽掉不想授予该安全级别的权限。接下来我们还得再多进行一
些八进制运算才能搞明白来龙去脉。

要把umask值从对象的全权限值中减掉。对文件来说,全权限的值是666(所有用户都有读
和写的权限);而对目录来说,则是777(所有用户都有读、写、执行权限)。

所以在上例中,文件一开始的权限是666,减去umask值022之后,剩下的文件权限就成了644。
在大多数Linux发行版中,umask值通常会设置在/etc/profile启动文件中(参见第6章),不过
有一些是设置在/etc/login.defs文件中的(如Ubuntu)。可以用umask命令为默认umask设置指定一
个新值。

$ umask 026
$ touch newfile2
$ ls -l newfile2
-rw-r——- 1 rich rich 0 Sep 20 19:46 newfile2
$

在把umask值设成026后,默认的文件权限变成了640,因此新文件现在对组成员来说是只
读的,而系统里的其他成员则没有任何权限。
umask值同样会作用在创建目录上。

$ mkdir newdir
$ ls -l
drwxr-x—x 2 rich rich 4096 Sep 20 20:11 newdir/
$

由于目录的默认权限是777,umask作用后生成的目录权限不同于生成的文件权限。umask
值026会从777中减去,留下来751作为目录权限设置。