# 权限管理

Linux 权限是操作系统用来限制不同用户对资源的访问机制. 摘自https://segmentfault.com/a/1190000022541406 (opens new window)

Linux 中的权限分为三类:

  • 基本权限:给文件和目录的所属者(u)、所属组(g)、其他用户(o) 分配的 读(r)、写(w)、执行(x) 权限
  • ACL权限:ACL 权限可以针对单一用户或用户组设定权限,是基本权限之外更细化的权限设定,弥补了基本权限设定不能满足的一些场景
  • 特殊权限:除了读写执行权限(rwx) 的另一种 特殊权限(s/t, SUID/SGID/SBIT)

# 基本权限

# 权限位介绍

使用 ls 命令时,长格式显示的第一列就是文件的权限,例如:

[root@localhost ~]# ls -l install.log
-rw-r--r--. 1 root root 28425 1130 18:50 install.log

第一列的权限位 -rw-r--r--.,则共11位,这11位权限位的含义如下:

第1位:代表文件类型。Linux不像Windows使用扩展名表示文件类型,而是使用权限位的第一位表示文件类型。虽然Linux文件的种类不像Windows中那么多,但是分类也不少,详细情况可以使用“info ls” 命令查看。这里列出一些常见的文件类型:

-: 普通文件 d: 目录文件。Linux中一切皆文件,所以目录也是文件的一种 l: 软链接文件 b: 块设备文件。这是一种特殊设备文件,存储设备都是这种文件,如分区文件/dev/sda1就是这种文件 c: 字符设备文件。这也是特殊设备文件,输入设备一般都是这种文件,如鼠标、键盘等 p: 管道符文件。这是一种非常少见的特殊设备文件。 s: 套接字文件。这也是一种特殊设备文件,一些服务支持socket访问就会产生这样的文件 第2~4位:代表文件所属者的权限

r: 代表read,是读取权限 w: 代表write,是写权限 x: 代表execute,是执行权限 第5~7位:代表文件所属组的权限,同样拥有 "rwx" 权限 第8~10位:代表文件其他人的权限,同样拥有 "rwx" 权限 第11位

.:如果是个点代表受 SELinux 安全上下文保护,这里忽略暂不做详细介绍 +:如果是个加号表示设置了ACL权限,下文再做详细介绍

# 权限含义解释

读、写、执行权限对文件和目录的含义是不同的。

权限对文件的作用

读(r):对文件有读权限,代表可以读取文件中的数据。如果把权限对应到命令上,那么一旦对文件有读权限,就可以对文件执行 cat、more、less、head、tail 等文件查看命令 写(w):对文件有写权限,代表可以修改文件中的数据。如果把权限对应到命令上,那么一旦对文件有写权限,就可以对文件执行 vim、echo 等修改文件数据的命令。注意:对文件有写权限,是不能删除文件本身的,只能修改文件中的数据,如果想要删除文件,则需要对文件的上级目录拥有写权限。 执行(x):对文件有执行权限,代表文件可以运行。在Linux中,只要文件有执行权限,这个文件就是执行文件了,只是这个文件到底能不能正确执行,不仅需要看执行权限,还要看文件的代码是不是正确的语言代码

权限对目录的作用

读(r):对目录有读权限,代表可以查看目录下的内容,也就是可以查看目录下有哪些文件和子目录。如果包权限对应到命令上,那么一旦对目录拥有了读权限,就可以在目录下执行 ls 命令查看目录下的内容了 写(w):对目录有写权限,代表可以修改目录下的数据,也就是可以在目录中新建、删除、复制、剪贴子文件或子目录。如果把权限对应到命令上,那么一旦对目录拥有了写权限,就可以在目录下执行 touch、rm、cp、mv 等命令 执行(x):目录是不能运行的,那么对目录拥有执行权限,代表可以进入目录。如果把权限对应到命令上,那么一旦对目录拥有了执行权限,就可以对目录执行 cd 命令进入目录

# 权限设定

# chmod命令

chmod 命令用来修改文件或目录的权限。

命令格式:chmod [选项] 权限模式 文件或目录

选项:

-R:递归设置权限,也就是给予目录中的所有文件和子目录设定权限 --reference=参考文件或目录:使用参考文件或参考目录的权限来设置目标文件或目录的权限 权限模式:权限模式分为符号组合和八进制数组合 符号组合的格式是[ugoa][[+-=][permission]],也就是[用户身份][[赋予方式][权限]]的格式。

  1. 用户身份

    • u:代表所有者(user)
    • g:代表所属组(group)
    • o:代表其他人(other)
    • a:代表全部身份(all)
  2. 赋予方式

    • +:加入权限
    • -:减去权限
    • =:设置权限
  3. 权限

    • r: 读取权限(read)
    • w: 写权限(write)
    • x: 执行权限(execute)

八进制数组合的格式是 [0-7][0-7][0-7] 三位数字组成(每一位数字都是权限之和),第一位是所属者权限之和,第二位是所属组权限之和,第三位其他人权限之和

r 读取权限对应的数字是 4 w 写权限对应的数字是 2 x 执行权限对应的数字是 1 例如读写权限 rw 八进制数表示 6

示例:

# 1. 添加组用户的写权限。
chmod g+w test.log 
# 2. 删除其他用户的所有权限。权限为空,即权限设置为'---'
chmod o= test.log
# 使所有用户都没有写权限 
chmod a-w test.log 
# 3. 当前用户具有所有权限,组用户有读写权限,其他用户只有读权限  
chmod u=rwx, g=rw, o=r test.log 
等价于 
chmod 754 test.log 
# 4. 将目录以及目录下的文件都设置为所有用户都拥有读写权限
chmod -R a=rw testdir/ 
# 5. 根据参考文件 a.log 的权限来 设置文件 test.log 的权限
chmod --reference=a.log ./test.log

# chown命令

chown 命令用来修改文件和目录的所有者和所属组。

命令格式:chown [选项] 所有者[:所属组] 文件或目录

选项:

-R:递归修改目录下所有的文件及子目录的所属者和所属组
--reference=参考文件或目录:使用参考文件或参考目录的所属者和所属组来设置目标文件或目录的所属者和所属组

所有者[:所属组]:当省略 ":所属组",仅改变文件所属者。

示例:

# 修改文件的所属者为 user1,所属组为 group1
chown user1:group1 test.log 

# chgrp命令

chown 命令只能用来修改文件和目录的所属组,其实完全可以由 chgrp 命令来替代。

命令格式:chgrp 用户组 文件或目录

选项:

-R:递归修改目录下所有的文件及子目录的所属组 --reference=参考文件或目录:使用参考文件或参考目录的所属组来设置目标文件或目录的所属组

# 默认权限与 umask

# 权限掩码:umask

当创建一个新的文件和目录是都默认会有一些权限,新建的文件权限一般是 "-rw-r--r--",新建的目录权限一般是 "drwxr-xr-x"。这些新建文件或目录的默认权限是由权限掩码 umask来决定的。在讲解 umask 之前,需要先了解一下文件和目录的默认最大权限

- 文件默认最大权限:对于文件来讲,新建文件的默认最大权限是 666 (即 -rw-rw-rw-),没有执行权限,只是因为执行权限对文件来讲比较危险,不能再新建文件的时候默认赋予,而必须通过用户手工赋予
- 目录默认最大权限:对于目录来讲,新建目录的默认最大权限是777 (即 drwxrwxrwx),这是因为对目录而言,执行权限仅仅代表进入目录,所以即使新建目录时直接默认赋予也没有什么危险

查看权限掩码值 和 新文件新目录的预设权限,如下:

[root@localhost ~]# umask
0022
[root@localhost ~]# umask -S
u=rwx,g=rx,o=rx
[root@localhost ~]# touch testfile
[root@localhost ~]# mkdir testdir 
[root@localhost ~]# ls -ld testfile testdir/
drwxr-xr-x. 2 root root 4096 422 14:48 testdir/
-rw-r--r--. 1 root root    0 422 14:47 testfile
[root@localhost ~]#

权限掩码值所表示的权限就是新建文件和新建目录要从默认最大权限里要排除的权限。查询掩码值由两种方式,直接执行 "umask" 以数字方式展示,可以看到有四位 '0022',其中第一位是特殊权限用的,这里暂时先不管,主要看后三位 "022",即"----w--w-";执行 "umask -S" 以符号方式展示,其中缺少的权限对应的权限值就是掩码值,这里用户组和其他用户都缺少 w,所以掩码值是 022。

# 默认权限计算方式

关于评论

评论前请填好“昵称”、“邮箱”这两栏内容,否则不会收到回复,谢谢!