Linux文件权限

Linux 文件权限笔记,摘自《Linux命令行与shell脚本编程大全》,方便以后查阅。

使用文件权限符

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

1
2
3
4
5
6
7
8
9
10
11
$ 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
$

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

1
2
3
4
5
6
- 代表文件
d 代表目录
l 代表链接
c 代表字符型设备
b 代表块设备
n 代表网络设备

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

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

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

  • 对象的属主
  • 对象的属组
  • 系统的其他用户

linux-file-permission

例子:

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

文件 myprog 有下面3组权限:

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

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

默认文件权限

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

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

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

1
2
3
$ umask
0022
$

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

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

permission-combination

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

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

在大多数 Linux 发行版中,umask 值通常会设置在 /etc/profile 启动文件中,可以用 umask 命令为默认 umask 设置指定一个新值。

1
2
3
4
5
$ umask 026
$ touch newfile2
$ ls -l newfile2
-rw-r----- 1 rich rich 0 Sep 20 19:46 newfile2
$

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

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

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

改变权限

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

chmod options mode file

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

options

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

八进制模式

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

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

符号模式

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

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

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

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

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

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

    例子:

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

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

    1
    2
    3
    4
    $ 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 选项可以让权限的改变递归地作用到文件和子目录。你可以使用通配符指定多个文件,然后利用一条命令将权限更改应用到这些文件上。

改变所属关系

chown

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

chown options owner[.group] file

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

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

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

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

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

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

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

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

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

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

chgrp

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

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

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

References

《Linux命令行与shell脚本编程大全》Richard Blum Christine Bresnahan

http://man.linuxde.net/chmod