#《快乐的 Linux 命令行》

#用户

当一个用户拥有一个文件或目录时,用户对这个文件或目录的访问权限拥有控制权。

1
2
$ id
uid=501(onns) gid=20(staff) groups=20(staff),12(everyone),61(localaccounts),79(_appserverusr),80(admin),81(_appserveradm),98(_lpadmin),33(_appstore),100(_lpoperator),204(_developer),250(_analyticsusers),395(com.apple.access_ftp),398(com.apple.access_screensharing),399(com.apple.access_ssh),400(com.apple.access_remote_ae),701(com.apple.sharepoint.group.1)

对于文件和目录的访问权力是根据读访问、写访问和执行访问来定义的。

1
2
3
$ > foo.txt
$ ls -l foo.txt
-rw-r--r--@ 1 onns staff 12 Nov 20 20:36 foo.txt

列表的前十个字符是文件的属性,第一个字符表明文件类型。

按键 效果
- 一个普通文件
d 一个目录
l 一个符号链接[1]
c 一个字符设备文件[2]
b 一个块设备文件[3]

剩下的九个字符叫做文件模式,代表着文件所有者文件组所有者其他人执行权限。

文件:

  • r:允许打开并读取文件内容。
  • w:允许写入文件内容或截断文件。但是不允许对文件进行重命名删除重命名或删除是由目录的属性决定的
  • x:允许将文件作为程序来执行,使用脚本语言编写的程序必须设置为可读才能被执行。

目录:

  • r:允许列出目录中的内容,前提是目录必须设置了可执行属性(x)
  • w:允许在目录下新建、删除或重命名文件,前提是目录必须设置了可执行属性(x)
  • x:允许进入目录,例如:cd directory

#chmod

只有文件的所有者或者超级用户才能更改文件或目录的模式。

chmod命令支持两种不同的方法来改变文件模式:八进制数字表示法符号表示法

八进制 二进制 文件模式
0 000 ---
1 001 --x
2 010 -w-
3 011 -wx
4 100 r--
5 101 r-x
6 110 rw-
7 111 rwx

常用权限:7 (rwx)6 (rw-)5 (r-x)4 (r--),和 0 (-–)

符号 解释
u user的简写,意思是文件或目录的所有者。
g groups的简写,用户组。
o others的简写,意思是其他所有的人。
a all的简写,是ugo三者的联合。

如果没有指定字符,则假定使用all

权限操作:

  • +:加上一个权限。
  • -:删掉一个权限。
  • =:只有指定的权限可用,其它所有的权限被删除。

多种设定可以用逗号分开。

u+x,go=rw:给文件拥有者执行权限并给组和其他人读和执行的权限。

#umask

当创建一个文件时,umask命令控制着文件的默认权限。
umask以掩码的形式来工作,和网关那里差不多,一般是022002

比如说正常一个权限是666110 110 110),即rw-rw-rw-,被022000 010 010)的umask后会变成110 100 100,即644rw-r--r--

虽然我们通常看到一个八进制的权限掩码用三位数字来表示,但是从技术层面上来讲,用四位数字来表示它更确切些。为什么呢?因为除了读取、写入和执行权限之外,还有其它较少用到的权限设置。

其中之一是 setuid 位(八进制 4000)。当应用到一个可执行文件时,它把有效用户 ID 从真正的用户(实际运行程序的用户)设置成程序所有者的 ID。这种操作通常会应用到一些由超级用户所拥有的程序。当一个普通用户运行一个程序,这个程序由根用户 (root) 所有,并且设置了 setuid 位,这个程序运行时具有超级用户的特权,这样程序就可以访问普通用户禁止访问的文件和目录。很明显,因为这会引起安全方面的问题,所有可以设置 setuid 位的程序个数,必须控制在绝对小的范围内。

第二个是 setgid 位(八进制 2000),这个相似于 setuid 位,把有效用户组 ID 从真正的用户组 ID 更改为文件所有者的组 ID。如果设置了一个目录的 setgid 位,则目录中新创建的文件具有这个目录用户组的所有权,而不是文件创建者所属用户组的所有权。对于共享目录来说,当一个普通用户组中的成员,需要访问共享目录中的所有文件,而不管文件所有者的主用户组时,那么设置 setgid 位很有用处。

第三个是 sticky 位(八进制 1000)。这个继承于 Unix,在 Unix 中,它可能把一个可执行文件标志为“不可交换的”。在 Linux 中,会忽略文件的 sticky 位,但是如果一个目录设置了 sticky 位,那么它能阻止用户删除或重命名文件,除非用户是这个目录的所有者,或者是文件所有者,或是超级用户。这个经常用来控制访问共享目录,比方说/tmp。


  1. 注意对于符号链接文件,剩余的文件属性总是rwxrwxrwx,而且都是虚拟值。真正的文件属性是指符号链接所指向的文件的属性↩︎

  2. 这种文件类型是指按照字节流来处理数据的设备。比如说终端机或者调制解调器。 ↩︎

  3. 这种文件类型是指按照数据块来处理数据的设备,例如一个硬盘或者 CD-ROM 盘。 ↩︎