Linux文件权限
Linux 文件权限笔记,摘自《Linux命令行与shell脚本编程大全》,方便以后查阅。
Linux文件权限
使用文件权限符
ls
命令可以查看 Linux 系统上的文件、目录和设备的权限
1 | ls –l |
输出结果的第一个字段就是描述文件和目录权限的编码。这个字段的第一个字符代表了对象的类型:
1 | - 代表文件 |
之后有 3 组三字符的编码,每组定义了 3 种访问权限:
1 | r 代表对象是可读的 |
若没有某种权限,在该权限位会出现单破折线 -
。这 3 组权限分别对应对象的 3 个安全级别:
- 对象的属主
- 对象的属组
- 系统的其他用户
例子:
1 | -rwxrwxr-x 1 rich rich 4882 2010-09-18 13:58 myprog |
文件 myprog 有下面3组权限:
1 | rwx: 文件的属主(设为登录名rich) |
这些权限说明登录名为 rich 的用户可以读取、写入以及执行这个文件(可以看作拥有全部权限)。类似地,rich 组的成员也可以读取、写入和执行这个文件。然而不属于 rich 组的其他用户只能读取和执行这个文件:w
被单破折线 -
取代了,说明这个安全级别没有写入权限。
默认文件权限
umask
命令用来设置所创建文件和目录的默认权限。
1 | touch newfile |
touch
命令用分配给我的用户账户的默认权限创建了这个文件。umask 命令可以显示和设置这个默认权限。
1 | umask |
第一位代表了一项特别的安全特性,叫作粘着位(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 设置指定一个新值。
1 | umask 026 |
在把 umask 值设成 026 后,默认的文件权限变成了 640,因此新文件现在对组成员来说是只读的,而系统里的其他成员则没有任何权限。umask 值同样会作用在创建目录上。
1 | mkdir newdir |
由于目录的默认权限是 777,umask 作用后生成的目录权限不同于生成的文件权限。umask 值 026 会从 777 中减去,留下来 751 作为目录权限设置。
改变权限
chmod
命令用来改变文件和目录的安全性设置。该命令的格式如下:
chmod options mode file
mode 参数可以使用 八进制模式 或 符号模式 进行安全性设置。八进制模式设置非常直观,直接用期望赋予文件的标准 3 位八进制权限码即可。
options
1 | -c 或 --changes: 效果类似 "-v" 参数,但仅回报更改的部分 |
八进制模式
1 | chmod 760 newfile |
八进制文件权限会自动应用到指定的文件上。
符号模式
与通常用到的 3 组三字符权限字符不同,chmod 命令采用了另一种方法。下面是在符号模式下指定权限的格式。
[ugoa…][[+-=][rwxXstugo…]
第一组字符定义了权限作用的对象:
1
2
3
4u 代表用户
g 代表组
o 代表其他
a 代表上述所有第二组的符号表示在现有权限基础上增加权限
+
,还是在现有权限基础上移除权限-
,或是将权限设置成后面的值=
。第三组符合代表作用到设置上的权限
1
2
3
4
5
6X:如果对象是目录或者它已有执行权限,赋予执行权限。
s:运行时重新设置 UID 或 GID。
t:保留文件或目录。
u:将权限设置为跟属主一样。
g:将权限设置为跟属组一样。
o:将权限设置为跟其他用户一样。例子:
1
2
3
4chmod o+r newfile
ls -lF newfile
-rwxrw-r-- 1 rich rich 0 Sep 20 19:16 newfile*不管其他用户在这一安全级别之前都有什么权限,
o+r
都给这一级别添加读取权限。1
2
3
4chmod u-x newfile
ls -lF newfile
-rw-rw-r-- 1 rich rich 0 Sep 20 19:16 newfileu-x
移除了属主已有的执行权限。注意 ls 命令的-F
选项,它能够在具有执行权限的文件名后加一个星号。
options 为 chmod 命令提供了另外一些功能。-R
选项可以让权限的改变递归地作用到文件和子目录。你可以使用通配符指定多个文件,然后利用一条命令将权限更改应用到这些文件上。
改变所属关系
chown
chown
命令用来改变文件的属主,格式如下:
chown options owner[.group] file
可用登录名或 UID 来指定文件的新属主。
1 | chown dan newfile |
chown 命令也支持同时改变文件的属主和属组。
1 | chown dan.shared newfile |
可以只改变一个目录的默认属组。
1 | chown .rich newfile |
如果 Linux 系统采用和用户登录名匹配的组名,可以只用一个条目就改变二者。
1 | chown test. newfile |
chown 命令采用一些不同的选项参数。-R
选项配合通配符可以递归地改变子目录和文件的所属关系。-h
选项可以改变该文件的所有符号链接文件的所属关系。
只有 root 用户能够改变文件的属主。任何属主都可以改变文件的属组,但前提是属主必须是原属组和目标属组的成员。
chgrp
chgrp
命令用来改变文件的默认属组。
1 | chgrp shared newfile |
用户账户必须是这个文件的属主,除了能够更换属组之外,还得是新组的成员。现在 shared 组的任意一个成员都可以写这个文件了。这是 Linux 系统共享文件的一个途径。
References
《Linux命令行与shell脚本编程大全》Richard Blum Christine Bresnahan