Linux文件权限

1. 使用文件权限符

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个安全级别:

  • 对象的属主

  • 对象的属组

  • 系统的其他用户

Linux文件权限

例子:

-rwxrwxr-x 1 rich rich 4882 2010-09-18 13:58 myprog

文件myprog有下面3组权限:

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

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

2. 默认文件权限

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

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

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

$ umask
0022
$

第一位代表了一项特别的安全特性,叫作粘着位(sticky bit),后面的3位表示文件或目录对应的umask八进制值。要理解umask是怎么工作的,得先理解八进制模式的安全性设置。

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

这里写图片描述

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

八进制的umask值是0022,而上面所创建的文件的八进制权限却是644。umask值只是个掩码,它会屏蔽掉不想授予该安全级别的权限。要把umask值从对象的全权限值中减掉。对文件来说,全权限的值是666(所有用户都有读和写的权限);而对目录来说,则是777(所有用户都有读、写、执行权限)。所以在上例中,文件一开始的权限是666,减去umask值022之后,剩下的文件权限就成了644。

在大多数Linux发行版中,umask值通常会设置在/etc/profile启动文件中,可以用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作为目录权限设置。

3. 改变权限

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

chmod options mode file

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

3.1 options

-c或--changes:效果类似“-v”参数,但仅回报更改的部分
-f或--quiet或--silent:不显示错误信息
-R或--recursive:递归处理,将指令目录下的所有文件及子目录一并处理
-v或--verbose:显示指令执行过程

3.2 八进制模式

$ chmod 760 newfile
$ ls -l newfile
-rwxrw---- 1 rich rich 0 Sep 20 19:16 newfile
$

八进制文件权限会自动应用到指定的文件上。

3.3 符号模式

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

[ugoa…][[+-=][rwxXstugo…]

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

    u代表用户
    g代表组
    o代表其他
    a代表上述所有
    
  • 第二组的符号表示在现有权限基础上增加权限(+),还是在现有权限基础上移除权限(-),或是将权限设置成后面的值(=)。

  • 第三组符合代表作用到设置上的权限

    X:如果对象是目录或者它已有执行权限,赋予执行权限。
    s:运行时重新设置UID或GID。
    t:保留文件或目录。
    u:将权限设置为跟属主一样。
    g:将权限设置为跟属组一样。
    o:将权限设置为跟其他用户一样。
    

    例子:

    $ chmod o+r newfile
    $ ls -lF newfile
    -rwxrw-r-- 1 rich rich 0 Sep 20 19:16 newfile*
    $
    

    不管其他用户在这一安全级别之前都有什么权限,o+r都给这一级别添加读取权限。

    $ chmod u-x newfile
    $ ls -lF newfile
    -rw-rw-r-- 1 rich rich 0 Sep 20 19:16 newfile
    $
    

    u-x移除了属主已有的执行权限。注意ls命令的-F选项,它能够在具有执行权限的文件名后加一个星号。

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

4. 改变所属关系

4.1 chown

chown命令用来改变文件的属主,格式如下:

chown options owner[.group] file

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

# chown dan newfile
# ls -l newfile
-rw-rw-r-- 1 dan rich 0 Sep 20 19:16 newfile
#

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

# chown dan.shared newfile
# ls -l newfile
-rw-rw-r-- 1 dan shared 0 Sep 20 19:16 newfile
#

可以只改变一个目录的默认属组。

# chown .rich newfile
# ls -l newfile
-rw-rw-r-- 1 dan rich 0 Sep 20 19:16 newfile
#

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

# chown test. newfile
# ls -l newfile
-rw-rw-r-- 1 test test 0 Sep 20 19:16 newfile
#

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

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

4.2 chgrp

chgrp命令用来改变文件的默认属组。

$ chgrp shared newfile
$ ls -l newfile
-rw-rw-r-- 1 rich shared 0 Sep 20 19:16 newfile
$

用户账户必须是这个文件的属主,除了能够更换属组之外,还得是新组的成员。现在shared组的任意一个成员都可以写这个文件了。这是Linux系统共享文件的一个途径。

5. References

《Linux命令行与shell脚本编程大全》Richard Blum Christine Bresnahan
http://man.linuxde.net/chmod

Logo

更多推荐