权限管理
- 第二讲 权限管理
- 1. Shell命令以及运行原理
- 1.1 知识引入
- 1.2 概念介绍
- 1.3 具体示例
- 2. Linux权限问题
- 2.1 权限概念
- 2.2 用户分类
- 2.3 切换用户
- 2.4 用户提权
- 2.5 文件权限管理
- 2.5.1 文件访问者的分类(角色)
- 2.5.2 文件类型和访问权限(事物属性)
- 2.5.2.1 文件类型
- 2.5.2.2 访问权限
- 补充:什么是可执行
- 2.5.2.3 具体示例
- 2.5.2.4 文件后缀与文件类型
- 2.5.3 文件权限值的表示方法
- 2.5.4 文件访问权限的相关设置指令
- 2.5.4.1 chmod 指令
- chmod 指令权限的格式
- 补充:访问文件时的特殊情况
- 2.5.4.2 chown 指令
- 2.5.4.3 chgrp 指令
- 2.6 目录权限管理
- 2.6.1 目录的权限
- 2.6.2 最终权限(缺省权限)
- 2.6.2.1 umask 指令
- 2.7 沾滞位
第二讲 权限管理
1. Shell命令以及运行原理
1.1 知识引入
都知道 Windows 以图形化界面为交互方式,而 Linux 以命令行界面为交互方式。 Windows 和 Linux 的交互方式虽然不同,但本质上是一样的,图形化界面和命令行界面都是为了让用户进行相关操作,而图形化界面和命令行界面就是所说的“外壳程序(Shell)”。
1.2 概念介绍
Linux 严格意义上说是一个操作系统,称之为“核心(kernel)”,但一般用户不能直接使用 kernel,而是通过 kernel 的“外壳程序”,也就是所谓的 Shell,来与 kernel 沟通。Shell 将外部输入的命令分析解析后将认为合法的信息传递给内核进行执行,内核执行完后将要返回的信息交给外壳再由外壳显示给用户。
Shell最简单的定义就是“命令行解释器”:
1)将使用者的命令翻译给核心(kernel)处理。
2)将核心的处理结果翻译给使用者。
1.3 具体示例
- 对于 Windows GUI,操作 Windows 不是直接操作 Windows 内核,而是通过图形接口、点击等方式来完成(比如进入 D 盘时,通常双击 D 盘盘符,或运行某个应用程序)。Windows GUI 会将进行的这些操作翻译为 Windows 内核所能理解的指令,然后传递给 Windows 内核进行处理。当 Windows kernel 处理完毕后,GUI 又会将处理结果翻译用户能够看懂的操作,这样与 Windows kernel 的交互成本就会被大大降低。
- 对于 Linux,Shell 有相同的作用:它负责解析用户输入的命令,并将解析后的指令传给 Linux 内核。内核执行后,将结果返回给 Shell,再由 Shell 解析并展示给用户。
帮助理解:
假设你是一个优秀的程序员,你家庭条件也很不错,你爸是村长,你家有两套房、一辆车,你自己的年薪也是30W+。你喜欢上了村里的另一个姑凉如花,但是呢你十分内向,不敢向如花表明你的心意。
但是你们村中有一个十分厉害的媒婆:王婆,王婆在你们村方圆十里都是最厉害的媒婆,只要它出马基本上就没有谈不成的。所以你找上了王婆,让她去向如花说媒,王婆也去了。
不幸的是,如花表示你是一个好人,但是你们不适合,并且如花已经和村里的另一个高富帅订婚了,再过一年就结婚。
但是你是一个十分专一的人,非如花不可,于是你还是三番五次的找王婆去给你再说一说,王婆试了几次之后发现这媒完全不可能,于是后面直接不鸟你了,也不再去找如花。
你看王婆直接不鸟你了(Shell拦截非法指令),于是跟王婆说:“我爸是村长,王婆您再去给我说说吧。”王婆看这事不办不行,但是如果继续三番五次去说媒,自己的口碑也没了。
最后,王婆想了一个办法,王婆收了十几个徒弟,然后每次你找王婆,王婆都找一些冠冕堂皇的借口说自己没空,然后派徒弟去找如花,这样即使失败了也可以说是因为徒弟萌新太菜了,这样即不得罪村长,也保住了自己的口碑。(实习生模式,Shell 会进行创建子进程的方式进行命令行的解析)
在上面的例子中,王婆就相当于 shell,用来传递你 (用户) 的信息 (指令) 给如花 (kernel),然后将如花的信息反馈给你,同时,王婆拒绝多次去说媒,相当于 shell 拦截了非法指令,变相的保护了 kernel。最后,为了保证自己的口碑,王婆安排自己的徒弟去说媒,相当于 shell 为了防止自身崩溃,所以自己不会直接去执行指令,而是派生子进程去执行命令行的解析。
补充:
shell 是 “外壳程序” 的统称,不同 Linux 版本对应的 shell 程序可能不同,其中 bash
是标准的 GNU shell,所以它成为了所有 Linux 发行版上的标准 shell。 现在大多数现代 Linux 发行版都默认提供 Bash shell 。 对应上面的例子来说,shell 是媒婆,而 bash 是王婆。
2. Linux权限问题
2.1 权限概念
什么是权限?
- 权限是限制人的。(人 = 真实的人 + 身份角色)
- 目标事物的属性也影响权限。
本质的说权限 = 角色 + 事物属性,最终就是权限影响你能不能做一件事。
2.2 用户分类
Linux下有两种用户:超级用户 (root) 与 普通用户
- 超级用户:可以在 Linux 系统下做任何事情,几乎不受权限的限制;
- 普通用户:在 Linux 下做权限范围内的事情;
- 超级用户的命令提示符是“#”,普通用户的命令提示符是“$”;
2.3 切换用户
Linux 切换用户的指令是:su [用户名]
在 Linux 中,如果要从超级用户切换到普通用户,直接 “su [用户名]
” 即可,没有任何限制:
但是如果要从普通用户切换到超级用户,就需要输入 root 密码。普通用户切换到 root 用户有两种方式:
- su:切换到 root 的当前目录;
- su -:直接切换到 root 的根目录;
**注意:**注:Linux 出于安全考虑,从键盘输入的密码在终端上是不会回显的,也就是说输入密码时屏幕不会显示任何东西。
2.4 用户提权
在工作使用Linux的时候可能会出现这样一种状况:当前有一条指令必须拥有超级用户的权限才能执行,但不想切换用户,想直接让普通用户以root用户的身份去执行该指令。
sudo 指令可以满足需求:
执行 sudo 指令发现了两个奇怪的现象:
1、使用 sudo 指令让我们拥有root用户的权限,按理来说应该输入root密码,但事实是它让输入自己普通用户的密码;
2、我以 tcq 的普通用户身份执行 sudo 指令,它提示 tcq 用户不在 sudoers file 内,sudo 失败。
上面这些现象是由 sudo 的机制造成的:sudo 存在的目的是为了 给受信任的用户提供最少的执行障碍,受信任的用户是指被添加到 sudoers 文件中的用户。也就是说,当普通用户存在于 sudoers 文件中时,说明 root 用户充分信任此普通用户,所以当这个普通用户使用 sudo 指令提升权限时只需要输入自己的密码即可。而如果此普通用户不在 sudoers 文件中,那么自然也不能通过 sudo 指令提权。
注意:sudo 的有限时间为15分钟,即当使用 sudo 提权成功后,后面15分钟内再次使用 sudo 指令不需要再次输入密码。
2.5 文件权限管理
因为在 Linux 下一切皆文件,所以 Linux 的权限问题都是依附于文件的,所以谈到权限一般指的是文件的权限。
同时在 2.1 中提到权限 = 角色 + 事物属性,这里的角色也就是文件访问者,事物属性也就是文件类型和访问权限。
2.5.1 文件访问者的分类(角色)
在 Linux 下,文件的访问者被分为三类:
- 所有者:文件和文件目录的所有者:u (user)。
- 所属组:文件和文件目录的所有者所在的组的用户:g (group)。
- 其他用户:除所有者和所属组用户之外的用户:o (other)。
关于文件的所有者和其他用户相信大家都很容易理解,但是为什么会有一个所属组呢?以一个例子说明:
假设一家刚起步的很穷的公司要开发一款产品,该公司的老板奉行竞争理念,所以他把手下的人分为了两个组,让他们来研发同一款产品,最后哪个组的产品更优哪个组就拿额外的奖金。
但是呢由于公司很穷,只买得起一台主机,这时候问题就出现了:两个组的成员公用一台主机,那么组内成员的代码如何进行共享呢?
如果我把文件设置为私有,这样虽然另外一组的人看不到我的代码,但同时我的队友也看不到,而如果我把文件设置为共有,那么又可能有代码泄露的风险。
为了解决这种情况,Linux 设计出了所属组的概念,可以把多个用户归为一个组,让组内的成员共享文件,组外的成员则受权限限制。
2.5.2 文件类型和访问权限(事物属性)
2.5.2.1 文件类型
Liunx 中一共有七种文件:
- d:目录;
- -:普通文件 (可执行程序也属于普通文件);
- l:软链接(类似Windows的快捷方式)
- b:块设备文件(例如硬盘、光驱等)
- p:管道文件
- c:字符设备文件(例如屏幕等串口设备)
- s:套接口文件
2.5.2.2 访问权限
在 Linux 中查看一个文件/目录时,文件前面通常会出现很长一串字符:
他们对应的含义如下:
第一个字符代表文件类型,后面九个字符三三一组分别代表文件拥有者、所属组和其他用户的权限,其中文件的权限一共分为四类:
r:读权限:Read 对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限。
w:写权限:Write 对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限。
x:可执行权限:execute 对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限。-:表示不具有该权限
补充:什么是可执行
在 Linux 下可执行 = 该文件是一个可执行文件 + 该角色有可执行权限
2.5.2.3 具体示例
-rwxr-xr-x 1 root root 8408 May 1 11:49 a.out
按上图中的第一行的 a.out
文件,其首先是一个普通文件,文件拥有者和所属组都是root,对于文件拥有者有读权限、写权限和可执行权限,对于文件所属组具有读权限和可执行权限,对于其他用户具有读权限和可执行权限。
2.5.2.4 文件后缀与文件类型
在之前就提到,Linux 中不以文件的后缀名来区分文件类型,文件后缀属于文件名的一部分。但这并不不代表不可以使用文件后缀来区分文件类型,意思就是虽然在 Linux 眼中文件后缀没用,但是可以把文件后缀当作对用户的一个提示符号;
同时,Linux 中不区分文件后缀并不代表 Linux 下的各种工具,比如 gcc、g++不区分。
2.5.3 文件权限值的表示方法
-
字符表示法
-
八进制数值表示法
2.5.4 文件访问权限的相关设置指令
2.5.4.1 chmod 指令
格式:chmod [参数] 权限 文件名
功能:设置文件的访问权限。
常用选项
- -R 递归修改目录文件的权限;
**注意:**只有文件的拥有者,或者root,可以修改自己的的权限。
chmod 指令权限的格式
-
用户符号 +/-/= 权限字符
用户符号:
- u:拥有者
- g:拥有者同组用户
- o:其它用户
- a:所有用户
+/-/= 的意义:
- +:向权限范围增加权限代号所表示的权限。
- -:向权限范围取消权限代号所表示的权限。
- =:向权限范围赋予权限代号所表示的权限。
权限字符:
- r:读权限
- w:写权限
- x:可执行权限
- -:取消此权限
指令演示:
-
对单个用户 ± 权限:
-
对多个用户 ± 权限:
-
三位八进制数字
文件的权限一共三种:读写执行,所以用三个二进制位就可以表示全部情况,每一位都代表一个权限,依次是读写执行,有此权限就置1,没有此权限就置0,最后组成的三位二进制数再转化为八进制数即可用三个八进制数,一次表示三个角色的三个权限。
指令演示:
补充:访问文件时的特殊情况
当遇到如下这中文件拥有者和文件所属组均为同一人,但是二者的权限不同,此时会依靠哪一个角色的权限呢?
user、group 和 other 与当前角色进行身份对比的时候,依次只对比一次。如上,test.txt 文件的拥有者和所属组成员都是 tcq 但是当取消了文件拥有者的读权限的时候尽管 tcq 身为所属组成员也应该有读权限但是因为身份对比顺序的问题其无法读取文件中的内容。
2.5.4.2 chown 指令
格式:chown [参数] 用户名 文件名
功能:修改文件的拥有者。
常用选项:
- -R 处理指定目录以及其子目录下的所有文件;
**注意:**当使用 chown 指令将属于自己的文件赋给别人时,需要获得别人的同意,所以在一般情况下是不能改变文件的拥有者的。只有 root 不受权限的约束,可以直接将属于 A 的文件赋给 B,而不需要征得 A 和 B 的同意。
2.5.4.3 chgrp 指令
格式:chgrp [参数] 用户组名 文件名
功能:修改文件或目录的所属组。
常用选项
- -R 递归修改文件或目录的所属组。
**注意:**和修改文件的拥有者一样,不能直接修改文件的所属组,需要征得别人的同意,而 root 不受权限约束。
2.6 目录权限管理
2.6.1 目录的权限
目录权限所代表的含义如下:
- 可执行权限:能否进入目录,如果目录没有可执行权限, 则无法cd到目录中。
- 可读权限:能否查看目录中的文件内容,如果目录没有可读权限, 则无法用 ls 等命令查看目录中的文件内容。
- 可写权限:能否在目录中创建与删除文件,如果目录没有可写权限, 则无法在目录中创建文件, 无法在目录中进行删除修改文件名等修改文件的操作。
2.6.2 最终权限(缺省权限)
根据上面权限的介绍,可知如果要进入一个目录,就必须有可执行权限,然而对于普通文件并不是必须需要有可执行权限。这也就是为什么普通文件的起始权限是666,而目录文件的起始权限是777的原因。
但是经过实践自行创建的普通文件最终权限是775,目录文件是664。而这也叫做缺省权限。造成这样的结果是因为创建文件或目录的时候除了受默认权限的约束之外,还要受到 umask (文件掩码) 的影响。
2.6.2.1 umask 指令
格式:umask 权限值
功能:查看或修改文件掩码。
**作用:**影响创建文件和目录的缺省权限,使用 umask的本质是增强操作系统对新需求的灵活性。
注意:
最终权限(默认) = 起始权限 & (~umask)
将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为0022,普通用户默认为0002。
指令演示:
查看文件掩码:
**修改文件掩码:**可以看到,当把文件掩码设置为000后,此时创建出的文件的最终权限就等于文件的起始权限。
2.7 沾滞位
在一个Linux系统中通常有很多用户,并且可以看到不同用户的家目录是只有用户本身可以进行访问等操作,不同的用户对于文件的访问是隔离的。
那么有时就会有这样一种需求:不同的用户需要在一个公共的目录下进行临时文件的增删查改,这个公共目录通常由 root 用户创建,然后将此目录默认掩码修改为777。
但是这里出现了一个问题:由于这个公共目录的权限是777,所以任何一个用户都可以删除此目录下的文件,无论该文件是否属于此用户。
为了出来上面这种不科学的情况,Linux 引入了粘滞位的概念。
粘滞位是权限的一种特殊情况,它不影响不同用户在公共目录下的读写执行操作,但是它可以禁止不同用户之间互删文件。粘滞位设置的方式很简单,只需要在已有权限基础上加上 t 即可,并且添加时不用指定用户,Linux 会自动识别。
当一个目录被设置为 “粘滞位” 以后,该目录下的文件只能由文件的所有者或者 root 删除,其余用户不能删除。