Shell的运行原理和Linux文件权限
文章目录
- Shell的运行原理和Linux文件权限
- 1. Shell的运行原理
- (1) Shell是什么
- (2) 为什么要有Shell
- (3) Shell的运行原理
- (4) 解析命令行
- 2. Linux文件
- (1) 文件属性
- (2) 文件类型
- (3) 文件权限
- (4) 文件权限的修改
- (1) chmod
- (2) chown
- (3) chgrp
- (5) umask掩码
- umask命令
- (6) 目录权限
- (1) 三个目录权限问题
- (2) 粘滞位
1. Shell的运行原理
(1) Shell是什么
我们常说Linux是操作系统,但是严格意义上讲,Linux是一个操作系统内核,也就是核心(kernel),是操作系统的基石,我们的一切代码最终都是运行在操作系统内核上的。但通常,普通用户是不能直接使用kernel的,而是通过一个类似于桥梁的程序,也就是Shell外壳,来与kernel进行交流的。
Shell外壳程序是操作系统的外在表现形式,我们通过Shell来与操作系统内核进行交互。在Linux,我们在命令行解释器上输入Shell命令,实际上并没有直接与操作系统内核交互,而是Shell外壳程序先将我们的命令进行解析,然后再传递给内核执行相关的代码。
站在广义的角度上,我们认为操作系统 = 内核 + Shell,内核是操作系统最基本的部分,而Shell是操作系统的外在表现形式,我们通过Shell外壳程序来与操作系统内核进行交互;站在狭义的角度上,我们认为Linux操作系统就是Linux内核,因为哪怕失去了Shell,Linux内核仍然可以正常运行。
(2) 为什么要有Shell
不知道各位有没有发现,当我们在Windows系统下,我们常常不需要使用繁杂的命令,只需使用鼠标点击就可以完成很多操作,而Linux系统下,我们则需要经常使用命令来完成很多操作,这是为什么呢?
如果站在操作系统的设计者的角度,对于一款操作系统,不仅要保护操作系统的核心数据和代码,还必须要给不同的用户提供良好的操作环境,在Windows下我们这种使用鼠标点击的方式叫做GUI(图形用户界面),而在Linux下我们这种使用命令的方式叫做CLI(命令行用户界面),这两种方式都是Shell外壳程序,这也就是Shell存在的意义,只不过前者是图形化,后者是命令行。
(3) Shell的运行原理
Shell的运行原理可以简单概括为:
- 创建子进程,对我们的命令进行解析
- 将解析后的命令传递给内核
- 内核执行命令
- 将执行结果返回给Shell
- Shell将执行结果输出到终端
Shell创建子进程是为了避免错误的命令导致影响整个Shell进程,如果命令执行失败,整个Shell进程就会崩溃,而创建子进程则可以避免这种情况。
(4) 解析命令行
当我们使用命令行解释器时,会出现一大堆的字符串,这些字符串叫做命令行,命令行通常由以下几个部分组成:
- 当前用户
- 主机名
- 当前路径
- 指令行内容
例如:
root@bite-alicloud:~/lesson6#
- 当前用户:root
- 主机名:bite-alicloud
- 当前路径:~/lesson6
- 指令行内容:#(#表示普通用户,$表示超级用户)
2. Linux文件
在Linux中,秉承着认为一切皆文件的思想,Linux将所有设备都抽象为文件,例如键盘、显示器、磁盘等,我们都可以将它们看作文件,文件 = 文件属性 + 文件内容。
(1) 文件属性
文件属性包括:
- 文件类型
- 文件权限
- 文件所有者
- 文件大小
- 文件创建时间
- 文件修改时间
当我们使用ll
命令时,会出现一大堆文件信息,例如:
-rw-r--r-- 1 root root 1234 1月 1 00:00 test.txt
解析:
-rw-r--r--
:文件权限1
:文件的链接数root
:文件所有者root
:文件所属组1234
:文件大小1月 1 00:00
:文件修改时间test.txt
:文件名
(2) 文件类型
在Linux中,文件类型不通过文件名后缀进行识别,而是通过文件属性里的权限前缀进行分类的,但我们还是推荐使用后缀,因为有些工具会识别后缀。
-
:普通文件(常见的有文本、源代码、图片、视频、库、可执行程序等)d
:目录文件b
:块设备文件(常见的是磁盘)c
:字符设备文件(常见有键盘、显示器)l
:链接文件p
:管道文件s
:socket文件
(3) 文件权限
文件权限包括:
- 文件所有者
- 文件所属组
- 其他用户
对于每一种角色来说,文件都需要提供三种权限:
- 读权限:
r
(read) - 写权限:
w
(write) - 执行权限:
x
(execute)
当我们使用ls -l
命令时,文件权限会显示在文件名的前面,例如:
-rw-r--r-- 1 root root 1234 1月 1 00:00 test.txt
对于这个例子,我们将文件权限分为四个部分:
-
:文件类型,表示是一个普通文件rw-
:文件所有者权限,表示文件所有者具有读写权限,但没有执行权限r--
:文件所属组权限,表示文件所属组具有读权限,但没有写权限和执行权限r--
:其他用户权限,表示其他用户具有读权限,但没有写权限和执行权限
也就是说,文件类型后会跟着9个字符,每三个字符表示一种角色,每种角色有三种权限,每种权限用r
、w
、x
表示,-
表示没有该权限。
8进制表示法:
如果我们将每一个权限用二进制表示,有该权限则用1表示,没有该权限则用0表示。那么,就会得到一个9个二进制位的数,每3个二进制位表示一种角色,这样,我们可以将每个角色的3个二进制位转换为8进制数,转换规则如下:
r
:4w
:2x
:1
这样,一个文件的权限可以使用3个8进制数表示:
- 第一个8进制数:文件所有者权限
- 第二个8进制数:文件所属组权限
- 第三个8进制数:其他用户权限
例如:
-rw-r--r--
该例子中,如果一个文件的权限是rw-r--r--
,那么,使用9个二进制表示为110100100
,我们再将其转化转换为8进制数,根据转换规则,得到644
。
(4) 文件权限的修改
(1) chmod
功能:修改文件权限。
语法:
chmod [OPTION]... MODE[,MODE]... FILE...
常见选项:
-R
:递归修改目录及其子目录下的所有文件权限-v
:显示修改后的文件权限-f
:不显示错误信息-c
:仅显示更改的部分-b
:修改所有文件的权限-n
:不实际修改文件权限,仅输出修改后的权限
MODE:
- 符号模式:
u+x
、u-x
、g+x
、g-x
、o+x
、o-x
、a+x
、a-x
等(u表示所有者,g表示所属组,o表示其他用户,a表示所有用户,+表示增加权限,-表示取消权限) - 八进制模式:
755
、644
、777
等
(2) chown
功能:修改文件所有者和所属组。
语法:
chown [OPTION]... [OWNER][:[GROUP]] FILE...
常见选项:
-R
:递归修改目录及其子目录下的所有文件的所有者和所属组-v
:显示修改后的文件所有者和所属组-f
:不显示错误信息-c
:仅显示更改的部分
OWNER:
- 用户名
- 用户ID
GROUP:
- 组名
- 组ID
(3) chgrp
功能:修改文件所属组。
语法:
chgrp [OPTION]... GROUP FILE...
常见选项:
-R
:递归修改目录及其子目录下的所有文件的所属组-v
:显示修改后的文件所属组-f
:不显示错误信息-c
:仅显示更改的部分
GROUP:
- 组名
- 组ID
(5) umask掩码
umask掩码:定制一个文件被创建时的默认权限。
我们创建的普通文件时,默认权限不是666(rw-rw-rw-),而是664(rw-rw-r–);我们创造的目录文件时,默认权限不是777(rwxrwxrwx),而是775(rwxrwxrw-)。为什么会导致我们的默认权限要比初始权限小呢?
这是因为umask掩码会从初始权限中去掉在umask中出现的权限,也就是说umask掩码是限制文件权限的一种手段。
起始权限可以用二进制表示,而umask掩码也可以用二进制表示,从起始权限中去掉(不是减法)在umask中出现的权限就是我们的默认权限。
比如:
初始权限:111 111 111(777)
umask:000 000 010 (002)
我们可以看到起始权限(777)中右边第二位(other权限)在umask出现,那么就会从’1’变为’0’,所以我们的默认权限是:111 111 101(775)。
目录文件的起始权限是777,普通文件是666。
起始权限 & (~umask) = 默认权限
umask命令
功能:设置文件创建时的默认权限。
语法:
umask [OPTION]... [MASK]
常见选项:
-S
:以符号模式显示掩码-p
:以八进制模式显示掩码
示例:
umask # 显示当前umask值,如022
umask -S # 以符号模式显示,如u=rwx,g=rx,o=rx
umask 027 # 设置新的umask值
默认权限计算:
- 目录文件:
起始权限:777
umask值:022
默认权限:755 (rwxr-xr-x)
- 普通文件:
起始权限:666
umask值:022
默认权限:644 (rw-r--r--)
注意事项:
- umask值通常在系统启动时由/etc/profile设置
- 用户可以在~/.bashrc中修改自己的umask值
- root用户默认umask值通常为022,普通用户为002
- umask值越大,默认权限越小
(6) 目录权限
(1) 三个目录权限问题
对于每个角色来说:
-
目录能否进入,取决于它的x(可执行权限);
-
目录能否被读取,取决于它的r(读权限);
-
目录下能否新建/删除/修改文件,取决于它的w(写权限),但是可以直接修改目录下的文件的权限属性。
(2) 粘滞位
一个文件能否被删除,并不取决于文件本身,而取决于文件所处的目录的权限,删除者在目录中对应的权限是否具有w权限。如果我们想在一个特定的目录下实现文件共享,将目录的非拥有者的权限w开放,会导致该目录里的文件的非拥有者可以随意删除文件,因此我们给目录新增了一个权限:t(粘滞位)
粘滞位:给目录的other设置的一个权限位,具有x(可执行权限)的意义,同时也进一步对目录权限进行特殊限定:该目录里的文件,只有root和文件或目录的拥有者成员有权利删除对应文件,其他人一概不允许。
当一个目录被设置为“粘滞位”(用chmod+t),则该目录下的文件只能由:
-
超级管理员删除
-
该目录的拥有者删除
-
该文件的拥有者删除