前言
生活中处处都存在着权限
,比如小区的门禁、朋友圈的访问、景区的门票进入等等都是权限
。Linux
中当然也存在权限
,用于更加规范的管理这一平台,下面就让我来介绍一下Linux权限的理解与学习吧
1. shell理解
shell
是包裹在Linux
内核kernel
之外的外层壳,又称为Linux外壳
,shell
是系统的用户界面,提供了用户与内核进行交互操作的一种接口,是在Linux内核与用户之间的解释器程序,它接收用户输入的命令并把它送入内核去执行
操作系统、shell和用户的关系图示:
上面是比较抽象的概念,下面我来举一个通俗易懂的例子方便大家理解:
- 村长的儿子张三喜欢隔壁家的翠花
- 李四也喜欢翠花和张三是竞争对手
- 王婆是村里有名的媒婆,有很多徒弟跟着她学习
情况一:张三托王婆去帮他说媒,王婆派出徒弟去办事,小美欣然同意,事儿成了
情况二:张三托王婆去帮他说媒,但是此时翠花已经和李四在一起了,翠花拒绝了此事
情况三:张三托王婆去帮他说媒,但是此时翠花已经和李四在一起了,张三由于非常喜欢翠花,于是找到了他的村长老爹帮忙,在“钞能力”的作用下李四和翠花被拆散,最终还是选择了张三
在上面这个情景中,张三就是用户,村长就是超级用户root
,翠花就是操作系统,是用户的操作对象,李四是可能存在的权限限制,王婆则就是shell
,她的徒弟就是执行命令时创建的子进程
上面的三种场景则分别对应着:
权限足够、权限不足、超级用户(root)下权限无阻
总结:
Linux
下,用户是通过shell
外壳来与操作系统进行交互的,shell
会创建子进程来进行命令行的传递和结果返回,在CentOS
中,bash
就是命令行解释器程序,也是个文件,归于shell
shell的作用:
1.帮忙进行命令行传递和返回结果
2.保护操作系统(防止危险指令对操作系统造成破坏)
3.执行命令时创建子进程执行
2. Linux权限的概念
权限是用来限制人的,因为事物可能天然缺失某种属性,所以权限就是一件事是否能做
Linux下权限 = 人 + 事物属性
3. Linux权限管理
3.1 用户分类
Linux下有两种用户:超级用户(root)、普通用户
超级用户:可以再Linux系统下做任何事情,不受限制
普通用户:在Linux下做有限的事情
- 超级用户的命令提示符是“#”,普通用户的命令提示符是“$“
3.2 用户切换
Linux下支持用户之间的切换
语法:su [选项] [用户名]
常见选项:-root
切换至超级用户的家目录下,并显示最近登录的信息,这里省略-root也可以切换到root用户下
4. 文件权限
4.1 文件访问者分类
- 文件和文件目录的所有者:u—User(中国平民 法律问题)
- 文件和文件目录的所有者所在的组的用户:g—Group(组织)
- 其它用户:o—Others (外国人)
注意:超级用户root
不受角色权限的限制,默认拥有所有权限
4.2 文件类型和访问权限(事物属性)
记住一句话:Linux下一切皆文件,对于每个文件都有它自己对外的权限,我们也可以对文件权进行设置来实现文件权限的划分。
文件分类:
d
:目录
-
:普通文件,比如文本文件、可执行文件等
l
:链接文件
b
:块设备文件,比如磁盘文件
c
:字符设备文件,比如键盘、显示器等
p
:管道文件
s
:网络文件
注意:在Linux
下文件的类型是由其详细信息中的第一个字符决定的(见上图),与文件后缀没有关系
那么为什么我们还要加上文件后后缀呢?
- 为了给用户和自己看,更加符合使用习惯,方便一眼区分类型
- 如
gcc
等Linux
下的软件,需要借助文件后缀来判断类型
Linux
中文件有三种权限:
r
:读权限,对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
w
:写权限,对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
x
:执行权限,对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
-
:表示不具有该项权限
如上图中的test.cpp
文件,对于文件所有者而言,其所具有的权限是rw-
,意思就是拥有读权限和写权限,没有执行权限
4.3 文件访问权限的相关设置方法
4.3.1 权限更改
普通用户在家目录中基本上是不受限制的,可以借助chmod
指令来对指定文件进行权限设置
语法:chmod u/g/o/a +/- r/w/x [文件]
功能:对指定文件进行权限设置
常见选项:-R
递归修改目录的权限(只有文件的拥有者和root才可以改变文件的权限)
chmod
命令权限值的格式:
+
:向权限范围增加权限代号所表示的权限-
:向权限范围取消权限代号所表示的权限=
:向权限范围赋予权限代号所表示的权限u
:拥有者g
:拥有者同组用o
:其它用户a
:所有用户
举个栗子:
这里还可以用八进制数字来修改权限,例如 chmod 100 test.cpp
表示将test.cpp
文件的拥有者权限修改为不可读不可写可执行,所属组和其他人权限清零,1表示有权限,0表示无权限
4.3.2 拥有者修改
语法:
chown [选项] 用户名 文件名
功能:修改文件的拥有者
4.3.3 所属组修改
语法:
chgrp [选项] 用户组名 文件名
功能:修改文件或目录的所属组
常用选项:
-R
递归修改文件或目录的所属组
4.3.4 文件类型辨识
语法:
file [文件]
功能:辨识文件类型
常用选项:
-c
详细显示指令执行过程,便于排错或分析程序执行的情形-z
尝试去解读压缩文件的内容
5. 目录权限
目录和文件一样也有权限,并且二者还略有差别
5.1 基本权限
目录的基本权限和文件一样也是rwx
r
:读权限,如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容
w
:写权限,如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件
x
:执行权限,如果目录没有可执行权限, 则无法cd
到目录中
-
:表示不具有该项权限
举个栗子:
可见没有r
权限是无法使用ll
查看文件内容的
5.2 默认权限
无论是创建文件还是目录,系统都会自动为其分配默认权限
文件:
1.文件的默认权限为664
,即rw-rw-r--
2.一般的文件都是没法直接执行的,所以所有的角色都默认没有可执行权限,为了保证文件的安全性,就默认不会赋予其他人Other
写的权限
目录:
1.目录的默认权限为
775
,即rwxrwxr-x
2.没有执行权限是无法访问目录的,这里默认去掉了其他人
Other
写的权限
5.3 权限掩码
Linux
规定普通文件的起始权限为666
(不包括可执行文件),目录的起始权限是777
为了更好的控制文件权限,系统通过
权限掩码(umask)
来取消部分角色的权限,例如Other
的写入权限
可以直接通过umask
指令来查看当前系统的默认权限掩码
如图,Centos7.6
Linux操作系统的权限掩码为002(八进制),平台不同权限掩码可能也不同
默认权限计算方式:
默认权限 = 起始权限 & (~umask)
注意是先将掩码按位取反后再与上起始权限
计算实例:
假设新建一个普通文件,系统起始的权限为 666 ,权限掩码为 002 ,带入公式可得默认权限:
- 666 & (~002) = 110 110 110 & (~000 000 010) = 110 110 110 & 111 111 101 = 110 110 100 = 664
假设新建一个目录,系统起始权限为 777 ,权限掩码为 002 ,带入公式可得默认权限:
- 777 & (~002) = 111 111 111 & (~000 000 010) = 111 111 111 & 111 111 101 = 111 111 101 = 775
6. 粘滞位
粘滞位是为了在一些特殊的场景下对目录进行限制
6.1 诞生背景
在未来使用Linux进行开发时未来我们可能会用到共享目录,这些目录是被所有的普通用户共享,用来保存普通用户产生的临时数据的
假设上司给A、B两个工作小组建立了一个共享目录,让其来分别完成同一项目来进行择优选取,两小组都完成后,虽然A组的成员不能查看B组的项目内容(没有读写权限),但是A组成员可以直接删除B组的工作文件,这是很不合理的情况
为了避免这种情况的发生,于是就有了粘滞位
的引入,粘滞位
可以限制目录,使得次目录下的文件只允许拥有者和超级用户才能删除
6.2 使用方法
建立一个共享目录后,利用root权限,使用 chmod +t [目录] 指令,来为此目录添加粘滞位就可以了,粘滞位添加成功后,该共享目录的 Other 的可执行权限会变成 t
Linux的权限介绍和理解到这里就介绍结束了,感谢大家的支持!
文章有写的不足或是错误的地方,欢迎评论或私信指出,我会在第一时间改正