1.2.3. 文件系统权限

类Unix系统的文件系统权限被定义给三类受影响的用户。

  • 拥有这个文件的用户u

  • 这个文件所属的其他用户(g

  • 所有其余的用户(o),同样称为“世界”和“所有人”

对文件来说,每个对应权限允许下列动作。

  • 可读r)权限允许所有者检查文件的内容。

  • 可写w)权限允许所有者修改文件内容。

  • 可执行x)权限允许所有者把文件当做一个命令运行。

对于目录来说,每个对应权限允许下列动作。

  • 可读r)权限允许所有者列出目录内的内容。

  • 可写w)权限允许所有者添加或删除目录里面的文件。

  • 可执行x)权限允许所有者访问目录里的文件。

在这里,一个目录的可执行权限意味着不仅允许读目录里的文件,还允许显示他们的属性,例如大小和修改时间。

ls(1)用于显示文件和目录的权限信息(更多)。当运行时带有“-l”选项,它将按给定顺序显示下列信息。

  • 文件类型(第一个字母)

  • 文件的访问权限(9个字符,三个字符组成一组按照用户、组、其他的顺序表示)

  • 链接到文件的硬链接数

  • 文件所有者的用户

  • 这个文件所属的

  • 以字符(字节)为单位的文件大小

  • 文件的日期和时间(mtime)

  • 文件的名字

表 1.4. “ls -l”输出的第一个字符列表

字符说明
-普通文件
d目录
l符号链接
c字符设备节点
b块设备节点
p命名管道
s套接字

chown(1)用于 root 账户修改文件的所有者。chgrp(1)用于文件的所有者或 root 账户修改文件所属的组。chmod(1)用于文件的所有者或root账户修改文件和文件夹的访问权限。操作一个foo文件的基本语法如下 。

  1. # chown <newowner> foo
  2. # chgrp <newgroup> foo
  3. # chmod [ugoa][+-=][rwxXst][,...] foo

例如,你可以按照下面使一个目录树被用户foo所有,并共享给组bar

  1. # cd /some/location/
  2. # chown -R foo:bar .
  3. # chmod -R ug+rwX,o=rX .

有三个更加特殊的权限位。

  • Set-User-ID(SUID)位(sS替换用户的x

  • Set-Group-ID(SGID)位(sS替换组的x

  • 粘滞位(tT替代其他用户的x

如果“ls -l”对这些位的输出是大写字母,则表示这些输出下面的执行位未设置

给一个可执行文件设置 Set-User-ID 位将允许一个用户以他自己的ID运行这个可执行文件(例如 root 用户)。类似的,给一个可执行文件设置了Set-Group-ID 位将允许一个用户以文件所属组的 ID 运行该文件。(例如 root 组)。由于这些设置可能导致安全风险,设置它们为可用的时候需要格外留意。

在一个目录上设置“Set-Group-ID”将打开类 BSD 的文件创建计划,所有在目录里面创建的文件将属于目录所属的

给一个目录设置“粘滞位”将保护该目录内的文件不被其所有者之外的一个用户删除。为了保护一个在像“/tmp”这样所有人可写或同组可写的目录下文件内容的安全,不仅要去除可写权限,还要给其所在目录设置粘滞位。否则,该文件可以被任意对其所在目录有写权限的用户删除并创建一个同名的新文件。

这里有一点有趣的文件权限例子。

  1. $ ls -l /etc/passwd /etc/shadow /dev/ppp /usr/sbin/exim4
  2. crw------T 1 root root 108, 0 Oct 16 20:57 /dev/ppp
  3. -rw-r--r-- 1 root root 2761 Aug 30 10:38 /etc/passwd
  4. -rw-r----- 1 root shadow 1695 Aug 30 10:38 /etc/shadow
  5. -rwsr-xr-x 1 root root 973824 Sep 23 20:04 /usr/sbin/exim4
  6. $ ls -ld /tmp /var/tmp /usr/local /var/mail /usr/src
  7. drwxrwxrwt 14 root root 20480 Oct 16 21:25 /tmp
  8. drwxrwsr-x 10 root staff 4096 Sep 29 22:50 /usr/local
  9. drwxr-xr-x 10 root root 4096 Oct 11 00:28 /usr/src
  10. drwxrwsr-x 2 root mail 4096 Oct 15 21:40 /var/mail
  11. drwxrwxrwt 3 root root 4096 Oct 16 21:20 /var/tmp

chmod(1)有另一种数值模式来描述文件权限。这种数字模式使用3到4位八进制(底为8)数。

表 1.5. chmod(1) 命令文件权限的数字模式

数字说明
第一个可选数字Set-User-ID (=4), Set-Group-ID (=2) 和 粘滞位 (=1) 之和
第二个数字用户可读 (=4), 可写 (=2)和 可执行 (=1) 权限之和
第三个数字权限同上
第四个数字位其他用户权限同上

这听起来很复杂实际上相当简单。如果你把“ls -l”命令输出的前几列(2-10),看成以二进制(底为2)表示文件的权限(“-”看成0,“rwx”看成1),你应该可以理解用数字模式值的最后3位数字对文件权限的八进制表示。

尝试下列例子

  1. $ touch foo bar
  2. $ chmod u=rw,go=r foo
  3. $ chmod 644 bar
  4. $ ls -l foo bar
  5. -rw-r--r-- 1 penguin penguin 0 Oct 16 21:39 bar
  6. -rw-r--r-- 1 penguin penguin 0 Oct 16 21:35 foo
[提示]提示

如果你需要在 shell 脚本中访问“ls -l”显示的信息,你需要使用相关命令,如test(1),stat(1)和readlink(1)。shell 内置命令,如“[”或“test”,可能也会用到。