目录
一、Linux权限的概念
Linux下有两种用户:超级用户(root)、普通用户。
- 超级用户:可以再linux系统下做任何事情,不受限制。
- 普通用户:在linux下做有限的事情。
- 超级用户的命令提⽰符是 "#",普通用户的命令提⽰符是 "$"。
**命令:**su [用户名]
**功能:**切换用户。
例如,要从root用户切换到普通用户user,则使⽤su user。要从普通用户user切换到root用户则使⽤su root(root可以省略),此时系统会提⽰输⼊root用户的口令。如图:

如果我们使用普通用户且无法切换root用户(比如不知道root密码),但想执行一些root用户才有权限做的事,我们可以通过一条命令(sudo)对普通用户进行提权。在需要提权的指令前面加上sudo命令,回车后输入当前普通用户的密码即可以root用户的身份执行该命令。

从上面操作我们会发现,如果这样操作我们只需要自己账号的密码就可以以root用户的权限去执行指令,那么root用户的权限不就形同虚设了吗。但其实不是所有的用户都可以进行提权的,Linux中存在一个叫做白名单的文件,只有该文件中指定的用户,才可以执行提权操作,且这个白名单只有root用户才能访问到内部的数据,也就是说只有root用户信任的人才能加入到白名单中,而只有白名单中的人才能够进行提权操作。

二、Linux的权限管理
权限 = 人 + 事物的属性。也就是说访问一个文件的权限既要看操作的的人是谁(所有者,所属组,other),也要看这个文件对于当前操作的这个人放开了那些属性(读,写,执行)。
2.1、文件访问者的分类(人)
- 文件和文件⽬录的所有者:u---User
- 文件和文件⽬录的所有者所在的组的用户:g---Group
- 其它用户:o---Others

**为什么会有所属组这个分类:**正常情况下,一个大的项目是由一个团队共同开发的,如果其中一个人写了一份代码,团队里的其他人想看一下,没有所属组的情况下,除了拥有者都是other,要想让别人也访问这份代码,就必须放开other的权限,但是这一个服务器可能有多个团队在使用,其他团队的人也是other,如果放开other权限,所有人都能访问这份代码,代码就泄漏出去了,所以引入所属组的概念,这样只需要放开所属组的权限,保证只有组内的人可以访问,组外的人仍然无法访问。
2.2、文件类型和访问权限(事物属性)
⽂件类型:
- d:⽂件夹
- -:普通⽂件
- l:软链接(类似Windows的快捷⽅式)
- b:块设备⽂件(例如硬盘、光驱等)
- p:管道⽂件
- c:字符设备⽂件(例如屏幕等串⼝设备)
- s:套接⼝⽂件
基本权限:
- 读(r/4):Read对⽂件⽽⾔,具有读取⽂件内容的权限;对⽬录来说,具有浏览该⽬录信息 的权限。
- 写(w/2):Write对⽂件⽽⾔,具有修改⽂件内容的权限;对⽬录来说具有删除、移动,新建⽬录内文件以及修改文件名的权限。
- 执⾏(x/1):execute对⽂件⽽⾔,具有执⾏⽂件的权限;对⽬录来说,具有进⼊⽬录的权限
- "---" 表⽰不具有该项权限。

如上图,文件所有属性的第一个字段,即红框框起来的部分,代表文件的类型,类型后面的九个字段,即黄框框起来的部分,代表文件的权限,其中前三个,即红色下划线的部分,代表拥有者对当前文件所能够执行的权限,中间三个,即绿色下划线的部分,代表所属组对当前文件所能够执行的权限,最后三个,即蓝色下划线的部分,代表other对当前文件能够执行的权限。
验证权限:

2.3、文件权值的表示方法
字符表⽰⽅法:

上图中以r,w,x形式所表示权限的方式就是字符表示法。
8进制数值表⽰⽅法:
对于读,写,执行权限而言,一个文件的任意一个角色要么就有这个权限,要么就没有这个权限,所以用二进制表示就是,1代表有这个权限,0代表没有这个权限,而一个角色的权限一共有三种,也就需要三个二进制位,三个二进制位最大表示数字7,所以可以用八进制表示一个角色的权限。其中,r在三个二进制位的最高位,即代表数字4,w在中间,即代表数字2,x在最后,即代表数字1(有权限的情况下,没有就是0)。例如666(八进制),就代表所有者,所属组,other都只有读写权限,都没有执行权限。
2.4、文件访问权限的相关设置方法
权限 = 角色(人) + 文件的权限属性。所以我们更改一个权限,无非就是更改一个文件的拥有者,所属组或者当前角色对于文件的权限属性。
2.4.1、chmod
**功能:**设置⽂件的访问权限。
**格式:**chmod [参数] 权限 ⽂件名
**常用选项:**R -> 递归修改⽬录⽂件的权限。
**说明:**只有⽂件的拥有者和 root 才可以改变⽂件的权限。
chmod命令权限值的格式:
- 用户表⽰符+,-,=权限字符
- +:向权限范围增加权限代号所表⽰的权限
- -:向权限范围取消权限代号所表⽰的权限
- =:向权限范围赋予权限代号所表⽰的权限
- 用户符号:
- u:拥有者
- g:拥有者同组
- o:其它用户
- a:所有用户
对拥有者权限进行修改:

对所属组权限进行修改:

对other权限进行修改:

对所有人权限一起进行修改:


用八进制进行修改:

注意:拥有者虽然可以给自己的文件加上可执行权限,但是真正能不能执行除了要看这个文件有没有可执行权限以外还要看这个文件是不是可执行文件,如果只是普通文件,即使我们加上了可执行权限,也无法执行。
2.4.2、chown
更改一个文件的所有者,所属组,权限相关的信息,必须是文件的拥有者或者root用户才能更改。
**功能:**修改⽂件的拥有者。
**格式:**chown [参数] 用户名 ⽂件名

但是这里还存在一个问题,这问题在chgrp命令中同样存在,所以在chgrp命令部分进行解释。
2.4.3、chgrp
更改一个文件的所有者,所属组,权限相关的信息,必须是文件的拥有者或者root用户才能更改。
**功能:**修改⽂件或⽬录的所属组。
**格式:**chgrp [参数] 用户组名 ⽂件名
常用选项:-R 递归修改⽂件或⽬录的所属组。

这里存在一个问题,上面代码是将所属组改成自己成功了,如果我们通过普通用户将该普通用户自己的文件的拥有者或所属组改成别人,就会失败,这是因为,正常情况下我们将一个文件给别人,肯定是要征得别人同意的,否则岂不是可以随便的将一些垃圾文件给别人,当然这个限制对于root用户是不存在的,因为root是超级用户,文件想给谁就给谁,所以普通用户想把自己的文件拥有者或是所属组改成别人可以通过提权操作来实现。普通用户操作失败示例:

2.4.4、umask
umask叫做权限掩码,新建⽂件默认权限=0666,新建⽬录默认权限=0777,而实际上所创建的⽂件和⽬录,看到的权限往往不是上⾯这个值。原因就是创建⽂件或⽬录的时候还要受到umask的影响。假设默认权限是mask,则实际创建的出来的文件权限是:mask &(~umask)。同时umask也是一条指令。
**格式:**umask 权限值
**功能:**查看或修改⽂件掩码
查看权限掩码:

**说明:**将默认的存取权限减去权限掩码后,即可产⽣建⽴⽂件时预设权限。超级用户默认掩码值为 0022,普通用户默认为0002。(第一个0不用管,只看后三位就可以)
修改权限掩码:

普通用户创建的目录和普通文件的权限大小:

从上图我们可以看到,新建的目录的权限是775,新建的普通文件的权限是664。
2.5、粘滞位
我们先看一个现象:

上图中可以看到一个普通用户将root用户的文件给删除了,正常来说root是超级用户,普通用户怎么可以随意就删掉属于root用户的文件呢?答案就在下图:

这个root用户的文件在普通用户的家目录中的一个目录中,所以该普通用户是这个目录的拥有者,那么从图中可以看到,普通用户对该目录有写权限,而目录的写权限允许该普通用户删除目录中的文件,所以就将root用户的文件删掉了。(即删除,新建文件和修改文件名不是属于文件自己的权限,而是该文件所在的目录的权限)
**引入粘滞位:**假如有一个团队的一些普通用户想要共享同一个文件或共享一些文件,这时为了让这些人都能够看到这些文件,就不能够将文件建到任何一个人的家目录(家目录默认除了自己,其他人没有任何操作权限,root用户除外),要在这些人的家目录以外建一个目录(可以在根目录下创建),但是这时为了让这个团队中的这些需要共享的普通用户都能够在这个共享的目录中创建自己想共享出去的文件,这个目录就必须开放所属组的 w 权限,但是开放所属组的 w 权限,团队内的不共享的人就可以随意删除这些文件,如果有人误删就麻烦了。所以引入粘滞位来解决这个问题。
⼀个⽬录被设置为"粘滞位"(⽤chmod + t),则该⽬录下的⽂件只能由以下三种情况删除:
- 超级管理员删除
- 该⽬录的所有者删除
- 该⽂件的所有者删除
