目录
[二、sudo 提权](#二、sudo 提权)
[四、chmod 指令](#四、chmod 指令)
[五、chgrp 和 chown 指令](#五、chgrp 和 chown 指令)

前言
本文主要了解Linux中的文件权限,包括认识什么是权限,认识文件属性和文件权限,学习指令 sudo、chmod、chgrp、chown等,还有认识目录权限,缺省权限以及粘滞位。相信读完后,能让你对Linux的权限有一个基本的认识和使用。
一、权限的概念
1.什么是权限
在现实生活中,可以通过常识确定:
- 权限是限制人的。人=真实的人+身份角色,也就是权限会给不同身份的人不同限制。
- 目标事物的属性也会影响权限。比如你不能在短视频软件上写代码,也不能在写代码软件上看短视频。
- 总之,权限 = 人+事物属性。最终影响你能还是不能做一件事。
2.认识人------用户
Linux下有两种用户:超级用户(root)、普通用户。
- 超级用户:可以再linux系统下做任何事情,不受限制
- 普通用户:在linux下做有限的事情。
- 超级用户的命令提示符是"#",普通用户的命令提示符是"$"。
3.su指令:切换用户
1.root用户下:su [普通用户] 可以直接切换,无需密码
2.普通用户下:直接使用 su 或者使用 su -,然后输入root账户密码即可切换
- su:只切换身份,不改变路径
- su -:重新登录root账户,进入root家目录,并且显示上次登录时间
3.普通用户之间的切换:su [用户名],然后需要输入对方账户密码
- (所在路径不会切换)
快捷键:Ctrl + D
- 快速切换成上一个用户,本质是exit指令
二、sudo 提权
如果我们想以普通用户的身份去执行更高权限的命令,就需要使用sudo
- sudo就是提权,获取更高权限,一般放在指令最前面使用。
- 比如我们以普通用户创建一个文件:
- 再使用 sudo 提权创建一个文件:
- 可以明显看到文件属性中用户名称的变化,所以 sudo 提权本质就是以root身份去执行命令。
- 但这里有一个疑问?我们使用sudo提权后,系统要求我们输入当前用户的密码,而不是root账户的密码,这是为什么呢?
配置文件------sudoers
- 其实如果是新创建的用户,是无法使用sudo提权的,如:
- 系统提示无法执行命令,并提到了一个文件------sudoers,其实这就是一个配置文件
- 该文件只能使用 root 账号才能打开 ,其实这文件就相当于一个白名单,只有写入了该名单的账号才能执行sudo指令。
- 该文件位于 /etc/sudoers ,我们使用root账户打开:
- 在该文件的100行左右,就能查看该白名单了,当我们将 user1 添加进白名单后,user1 就能正常使用 sudo 指令了。
(建议学完vim的使用后再进行配置修改)
- 这样大概能理解为什么使用sudo需要输入当前普通用户的密码了吧,因为配置文件时root已经默许了,输入当前用户密码只是确实是当前用户在操作。
sudo的使用场景:
- 目前我们比较常见的使用场景就是下载软件时使用了。
- 比如 sudo yum install ... / sudo apt install ,,,
普通用户使用 sudo 并输入密码后,短时间(大概15min)以内再次使用sudo是不需要输入密码的。
三、文件属性和访问权限
前面说过,权限=角色+事物属性,而在Linux中,一切皆文件,文件的属性就和权限密切相关
1.对文件属性的基本了解
- 首先通过 ll 就可以快速查看文件的属性:
- 现在我们来认识文件的这些属性:
- 关于后面3列:文件大小、修改时间、文件名,这些是我们比较熟悉的属性就不多说了。
- 我们先具体认识一下文件类型有哪些:
- d:目录(文件夹)
- -:普通文件
- c:字符设备文件,例如屏幕等串口设备
- b:块设备文件,例如硬盘、光驱等
- p:管道文件
- l:链接文件,类似Windows的快捷方式
2.认识拥有者和所属组
- 第一列用户名代表的就是该文件的拥有者,一般谁创建就是谁;第二列用户名就代表该文件的所属组,默认是创建者单独一组,不过可以修改。
- Linux中的角色分3类:文件拥有者、文件所属组、other
- other不需要存储,只要是拥有者或者所属组就一定不是other,所以other不显示
- 注意角色是一层身份,它需要依附于具体的人,人 = 真实的人+身份角色
- 所属组存在的原因,是多人使用同一台服务器时,便于分组管理权限,比如某些文件哪些人可看那些人不可看就可以通过所属组实现。
- 接下来我们来看具体的访问权限:
3.认识文件的访问权限:
- 首先需要知道这些权限:r 代表可读权限、w 代表可修改权限、x 代表可执行权限。
- 除去第一列代表文件类型的字符,剩下的9个字符每3个为一组,分别代表拥有者权限、所属组权限、other权限。(- 代表无此权限)
- 以拥有者为例,rwx 一组,这3个字母的位置是固定的,有这个权限对应位置就有这个字母,没有就是 - 。
- 下面我们来讲如何修改这些权限:
四、chmod 指令
1.用法1:chmod [角色字符][+/-/=][权限] [文件名]
- chmod 指令就是用来设置文件的访问权限。
角色字符:
- u:拥有者
- g:所属组
- o:其它用户
- a:所有用户
+ / - / = :
- +:向权限范围增加权限代号所表示的权限
- -:向权限范围取消权限代号所表示的权限
- =:向权限范围赋予权限代号所表示的权限
常用选项:
- R -> 递归修改目录文件的权限
- 说明:只有文件的拥有者和root才可以改变文件的权限
演示:
- 取消拥有者w权限,使其无法写入文件:
- 取消拥有者r权限,使其无法读文件:
- 取消所属组的rw权限:
- 取消other的r权限:
- 一次性给三位角色增加不同权限:
- 一次性取消三位角色的不同权限:
- 给所有人增加r权限:
- 给所有人取消r权限:
- 最后,给所有人增加所有权限:
- (绿色一般代表可执行文件,但test.txt并不是一个可执行文件)
- Linux下能执行 = 真的是一个可执行文件 + 可执行权限
- 给所有人取消可执行文件:
- 注意,取消权限时即使有角色对应权限本来就没有,也不会有影响,所以 a-rwx 就能直接取消全部权限。
- 然后如果增加或者取消权限时,没有带上用户字符,直接 + 或者 - 权限时,默认是给所有人加减权限。
- 只有文件的拥有者和root能修改文件的访问权限
"Permission denied" 的核心翻译是 " 权限被拒绝*"**。*
一些结论
(1)root不受访问权限约束:

(2)文件识别访问者身份时,只会识别一次
- 你有没有疑惑过,一个用户既是文件的拥有者又是文件的所属组,那他能通过所属组的权限来访问文件吗?如:
- 很明显,user1作为拥有者和所属组,如果对应拥有者权限没有,即使对应所属组有权限,那user1也不能访问文件。
- 这就是因为文件在第一次识别操作者身份时,会依次对比其是否为:拥有者->所属组->other。一旦识别到操作者身份为拥有者时,就不会往下识别了,以后该操作者只能使用拥有者的权限。同理,如果操作者为所属组,在文件第一次识别到操作者身份是所属组后,以后该操作者只能使用该文件的所属组权限。
- 我们可以使用 chgrp 指令修改所属组对应的用户(下文详说)
2.用法2:chomd [数字] [文件名]
- 3个字符为一组的权限,每个位置有两种情况 (r/-)(w/-)(x/-),在C语言中1表示有0表示无,所以 rwx 可以用二进制 111 代替,换算为八进制就是 7。
- 所以每组权限无非以下8种情况:
- 000、001、010、011、100、101、110、111;
- 并且可以用八进制代替表示:
- 0、1、2、3、4、5、6、7
- 所以chmod加数字就能设置文件权限
- 如:给拥有者和所属组设置rw-(110 / 6)权限、给other设置r--(100 / 4)权限
- 如:给所有人所有权限
- 如:去掉所有人所有权限
两种方法各有好处,自行选择即可:用法1可读性强,用法2便捷性强
五、chgrp 和 chown 指令
1.chgrp指令
- 用法:chgrp [用户名] [文件名]
- 功能:修改文件或目录的所属组
演示:注意普通用户需要sudo提权
- 现在txp用户就能使用该文件的所属组权限了:
- 注意:以上操作在其他用户的家目录下可能不成功,这是因为家目录也存在权限,我们可以在根目录下创建一个所有人都有完整权限的目录进行操作验证。
2.chown指令
- 用法1:chown [用户名] [文件名]
- 说明:修改文件的拥有者,需要root权限或者sudo提权
- 用法2:chown [用户名]:[用户名] [文件名]
- 说明:同时修改文件的拥有者和所属组,同样需要root或者sudo提权
演示:
- 修改拥有者:
- 此时user1不具备拥有者权限,只有所属组权限:
- 同时修改拥有者和所属组:
温馨提示:如果一个用户对某文件没有 r 权限,那么该用户无论用什么工具(包括但不限于:nano、vim等)都无法查看文件内容
六、目录权限
前面我们都是在说普通文件的权限,那么对于目录的权限有什么不一样呢?
- 下面是使用root用户在根目录下创建的一个全权限的目录:
- 现在,我们来了解目录的 r w x 权限分别对应什么功能:
1. 对于目录的 r 权限,如果没有就无法查看该目录下的所有文件和文件内容
- 演示,只去掉 r:
2. 对于目录的 w 权限,如果没有就不能修改该目录下的所有文件,包括创建、删除、移动、拷贝等操作
- 演示,只去掉 w:
3.对于目录的 x 权限,如果没有就无法进入该目录
- 演示:只去掉 x:
家目录,只有对应的拥有者拥有权限,其他普通用户没有任何权限:

同样,对于根目录,只有root有修改的权限:

七、缺省权限
1.什么是缺省权限
- 缺省权限其实就是我们在创建文件或目录时系统默认给出的权限,一般对于普通文件缺省权限为664(rw-rw-r--),对于目录缺省权限一般是775(rwxrwxr-x):
- 但这缺省权限其实并不是文件的初始权限,对于普通文件的初始权限一般为666(rw-rw-rw-),对于目录的初始权限一般是777(rwxrwxrwx),那为什么最终会变为缺省权限的664和775呢?这其实的奥秘就是权限掩码->umask
2.权限掩码: umask
- 使用指令 umask 就能查看当前的权限掩码:
- 一般默认就是002,最前面那个0暂时可以忽略。哪权限掩码是做什么的呢?
- 权限掩码的功能:设置缺省权限
- 权限掩码设置缺省权限的原理:缺省权限 = 起始权限 & (~umask)
- 说明:这其实是二进制的位运算,缺省权限等于起始权限的二进制码与权限掩码的反码的与运算结果。
- **演示:**664 和 775 的缺省权限由来
设置缺省权限演示:
- 用法:umask [数字]
- 例如1:设置权限掩码为 000,效果就是初始权限是多少就是多少,也就是666和777
- 例如2:设置权限掩码为777,因为其反码为000,0&任何都是0,所以效果就是权限为0
umask设置缺省权限在一些常见下还是有意义的,更加方便初始化文件的权限等等
八、粘滞位
1.什么是粘滞位:
- 粘滞位其实就是将目录权限的最后一位,也就是other的x权限修改为 t
- 用法:chmod +t [目录](普通用户需要sudo提权)
- 说明:粘滞位只能给目录设置,不需要给普通文件设置
2.粘滞位有什么用:
- 在设置了粘滞位的目录下,用户创建的文件其他人无法删除,只有文件的拥有者具有删除文件的权限。
- root无视
粘滞位的用处:
- 比如现在需要一个共享文件,那么root可以在根目录下创建一个全权限的目录,提供给所有用户使用:
- 现在,txp在该目录中创建一个文件,并限制其他人只有读的权限
- 但是,不合理的是,其他用户可以直接删掉该文件:
- 这里的原因就是目录给了所有人修改的权限,普通文件是否可删除在于目录是否给了w权限,所以为了解决这个问题,粘滞位就出现了,只要使用 chmod +t 给对应目录加上粘滞位,文件的删除只能是该文件的拥有者:
- 先加上粘滞位,目录的最后一个权限位会变为 t:
- 此时,txp 创建一个文件:
- 其他用户就无法删除 txp 创建的文件了:
- 只要该文件的拥有者或者root才能删除该文件:
最后说明一下,Linux根目录中存在默认的共享目录:tmp
- 很明显的能看到其粘滞位 t
总结
以上就是本文的全部内容了,感谢支持!