Linux——Shell的运行原理和Linux文件权限

Shell的运行原理和Linux文件权限

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的运行原理可以简单概括为:

  1. 创建子进程,对我们的命令进行解析
  2. 将解析后的命令传递给内核
  3. 内核执行命令
  4. 将执行结果返回给Shell
  5. Shell将执行结果输出到终端

Shell创建子进程是为了避免错误的命令导致影响整个Shell进程,如果命令执行失败,整个Shell进程就会崩溃,而创建子进程则可以避免这种情况。

(4) 解析命令行

当我们使用命令行解释器时,会出现一大堆的字符串,这些字符串叫做命令行,命令行通常由以下几个部分组成:

  • 当前用户
  • 主机名
  • 当前路径
  • 指令行内容

例如:

root@bite-alicloud:~/lesson6#
  1. 当前用户:root
  2. 主机名:bite-alicloud
  3. 当前路径:~/lesson6
  4. 指令行内容:#(#表示普通用户,$表示超级用户)

2. Linux文件

在Linux中,秉承着认为一切皆文件的思想,Linux将所有设备都抽象为文件,例如键盘、显示器、磁盘等,我们都可以将它们看作文件,文件 = 文件属性 + 文件内容。

(1) 文件属性

文件属性包括:

  • 文件类型
  • 文件权限
  • 文件所有者
  • 文件大小
  • 文件创建时间
  • 文件修改时间

当我们使用ll命令时,会出现一大堆文件信息,例如:

-rw-r--r-- 1 root root 1234 11 00:00 test.txt

解析:

  1. -rw-r--r--:文件权限
  2. 1:文件的链接数
  3. root:文件所有者
  4. root:文件所属组
  5. 1234:文件大小
  6. 1月 1 00:00:文件修改时间
  7. 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 11 00:00 test.txt

对于这个例子,我们将文件权限分为四个部分:

  1. -:文件类型,表示是一个普通文件
  2. rw-:文件所有者权限,表示文件所有者具有读写权限,但没有执行权限
  3. r--:文件所属组权限,表示文件所属组具有读权限,但没有写权限和执行权限
  4. r--:其他用户权限,表示其他用户具有读权限,但没有写权限和执行权限

也就是说,文件类型后会跟着9个字符,每三个字符表示一种角色,每种角色有三种权限,每种权限用rwx表示,-表示没有该权限。

8进制表示法:
如果我们将每一个权限用二进制表示,有该权限则用1表示,没有该权限则用0表示。那么,就会得到一个9个二进制位的数,每3个二进制位表示一种角色,这样,我们可以将每个角色的3个二进制位转换为8进制数,转换规则如下:

  • r:4
  • w:2
  • x: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+xu-xg+xg-xo+xo-xa+xa-x等(u表示所有者,g表示所属组,o表示其他用户,a表示所有用户,+表示增加权限,-表示取消权限)
  • 八进制模式:755644777
(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值

默认权限计算

  1. 目录文件:
起始权限:777
umask值:022
默认权限:755 (rwxr-xr-x)
  1. 普通文件:
起始权限:666
umask值:022
默认权限:644 (rw-r--r--)

注意事项

  1. umask值通常在系统启动时由/etc/profile设置
  2. 用户可以在~/.bashrc中修改自己的umask值
  3. root用户默认umask值通常为022,普通用户为002
  4. umask值越大,默认权限越小

(6) 目录权限

(1) 三个目录权限问题

对于每个角色来说:

  1. 目录能否进入,取决于它的x(可执行权限);

  2. 目录能否被读取,取决于它的r(读权限);

  3. 目录下能否新建/删除/修改文件,取决于它的w(写权限),但是可以直接修改目录下的文件的权限属性。

(2) 粘滞位

一个文件能否被删除,并不取决于文件本身,而取决于文件所处的目录的权限,删除者在目录中对应的权限是否具有w权限。如果我们想在一个特定的目录下实现文件共享,将目录的非拥有者的权限w开放,会导致该目录里的文件的非拥有者可以随意删除文件,因此我们给目录新增了一个权限:t(粘滞位)

粘滞位:给目录的other设置的一个权限位,具有x(可执行权限)的意义,同时也进一步对目录权限进行特殊限定:该目录里的文件,只有root和文件或目录的拥有者成员有权利删除对应文件,其他人一概不允许。

当一个目录被设置为“粘滞位”(用chmod+t),则该目录下的文件只能由:

  1. 超级管理员删除

  2. 该目录的拥有者删除

  3. 该文件的拥有者删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值