文件权限

ls命令可以用来查看Linux系统上的文件、目录和设备的权限。

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

之后有3组三字符的编码。每一组定义了3种访问权限:

  1. r代表对象是可读的
  2. w代表对象是可写的
  3. x代表对象是可执行的

若没有某种权限,在该权限位会出现单破折线。这3组权限分别对应对象的3个安全级别.

这些权限说明登录名为rich的用户可以读取、写入以及执行这个文件(可以看作有全部权限)。 类似地,rich组的成员也可以读取、写入和执行这个文件。然而不属于rich组的其他用户只能读取 和执行这个文件:w被单破折线取代了,说明这个安全级别没有写入权限。

默认文件权限

umask命令用来设置所创建文件和目录的默认权限。

第一位代表粘着位(sticky bit)后面的3位表示文件或目录对应的umask八进制值。umask值只是个掩码。它会屏蔽掉不想授予该安全级别的权限。

八进制模式的安全性设置先获取这3个rwx权限的值,然后将其转换成3位二进制值,用一个八进制值来表示。在这个二进制表示中,每个位置代表一个二进制位。因此,如果读权限是唯一 置位的权限,权限值就是r–,转换成二进制值就是100,代表的八进制值是4。

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

umask值通常会设置在/etc/profile启动文件中(参见第6章),不过有一些是设置在/etc/login.defs文件中的(如Ubuntu)。可以用umask命令为默认umask设置指定一 个新值。

文件一开始的权限是666,减去umask值022之后,剩下的文件权限就成了644。

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

改变安全性设置

改变权限

chmod命令用来改变文件和目录的安全性设置。该命令的格式如下:

chmod options mode file

mode参数可以使用八进制模式或符号模式进行安全性设置。八进制模式设置非常直观,直接用期望赋予文件的标准3位八进制权限码即可。

与通常用到的3组三字符权限字符不同,chmod命令采用了另一种方法。下面是在符号模式 下指定权限的格式。

[ugoa...][[+-=][rwxXstugo...]

第一组字符定义了权限作用的对象:

  1. u代表用户
  2. g代表组
  3. o代表其他
  4. a代表上述所有

后面跟着的符号表示你是想在现有权限基础上增加权限(+),还是在现有权限基础上移除权限(-),或是将权限设置成后面的值(=)。

最后,第三个符号代表作用到设置上的权限。你会发现,这个值要比通常的rwx多。额外的设置有以下几项。

像这样使用这些权限。

$ chmod o+r newfile

options为chmod命令提供了另外一些功能。-R选项可以让权限的改变递归地作用到文件和子目录。你可以使用通配符指定多个文件,然后利用一条命令将权限更改应用到这些文件上。

改变所属关系

Linux提供了两个命令来实现这个功能:chown命令用来改变文件的属主, chgrp命令用来改变文件的默认属组。

chown命令的格式如下。

chown options owner[.group] file

可用登录名或UID来指定文件的新属主。

# chown dan newfile

chown命令也支持同时改变文件的属主和属组。

# chown dan.shared newfile

如果你不嫌麻烦,可以只改变一个目录的默认属组。

# chown .rich newfile

如果你的Linux系统采用和用户登录名匹配的组名,可以只用一个条目就改变二者。

# chown test. newfile

chown命令采用一些不同的选项参数。-R选项配合通配符可以递归地改变子目录和文件的所 属关系。-h选项可以改变该文件的所有符号链接文件的所属关系。

只有root用户能够改变文件的属主。任何属主都可以改变文件的属组,但前提是属主必须是原属组和目标属组的成员。

chgrp命令可以更改文件或目录的默认属组。

$ chgrp shared newfile	

用户账户必须是这个文件的属主,除了能够更换属组之外,还得是新组的成员。

共享文件

Linux系统上共享文件的方法是创建组。

创建新文件时,Linux会用你默认的UID和GID给文件分配权限。想 让其他人也能访问文件,要么改变其他用户所在安全组的访问权限,要么就给文件分配一个包含 其他用户的新默认属组。

如果你想在大范围环境中创建文档并将文档与人共享,这会很烦琐。幸好有一种简单的方法 可以解决这个问题。

Linux还为每个文件和目录存储了3个额外的信息位。

  1. 设置用户ID(SUID):当文件被用户使用时,程序会以文件属主的权限运行。

  2. 设置组ID(SGID):对文件来说,程序会以文件属组的权限运行;对目录来说,目录中创建的新文件会以目录的默认属组作为默认属组。

  3. 粘着位:进程结束后文件还驻留(粘着)在内存中。

SGID位对文件共享非常重要。启用SGID位后,你可以强制在一个共享目录下创建的新文件.都属于该目录的属组,这个组也就成为了每个用户的属组。

SGID可通过chmod命令设置。它会加到标准3位八进制值之前(组成4位八进制值),或者在符号模式下用符号s。

如果你用的是八进制模式,你需要知道这些位的位置,

因此,要创建一个共享目录,使目录里的新文件都能沿用目录的属组,只需将该目录的SGID 位置位。

首先,用mkdir命令来创建希望共享的目录。然后通过chgrp命令将目录的默认属组改为包 含所有需要共享文件的用户的组(你必须是该组的成员)。最后,将目录的SGID位置位,以保证 目录中新建文件都用shared作为默认属组。

为了让这个环境能正常工作,所有组成员都需把他们的umask值设置成文件对属组成员可 写。在前面的例子中,umask改成了002,所以文件对属组是可写的。

做完了这些,组成员就能到共享目录下创建新文件了。跟期望的一样,新文件会沿用目录的 属组,而不是用户的默认属组。现在shared组的所有用户都能访问这个文件了。