Shell的运行原理
在谈Shell的运行原理之前,我们先说一下Windows操作系统。
Windows操作系统是鼠标+键盘一起操作的,用鼠标在可视化界面上点点点,然后用键盘输入就可以完成操作了。
但,Linux却不一样,Linux是命令行界面,不是可视化界面,因此Linux系统并不需要鼠标就可以操作了。
但,说到底,命令行界面和可视化界面也都是界面,他们本质上都是一样的,都是为了方便用户操作的东西。这个界面就被称为是“外壳程序”。

可视化界面常用于家庭和个人使用;命令行界面常在企业中使用。
Linux严格意义上来说,还是一个操作系统,我们称之为“kernel”,但是用户是无法使用kernel的,而是通过一个外壳程序,来和kernel进行交互。
因此,我们就可以这样来理解Shell
Shell:命令行解释器
- 将使用者的命令翻译给核心kernel处理。
- 将核心的处理结果反馈给使用者
对比Windows操作系统中的图形化界面(GUI),我们操作Windows并不是直接操作Windows的内核,而是通过图形接口来完成自己的操作的。
下面,我们说一下Shell的运行原理:
- 创建子进程,让子进程进行命令行翻译。
- 子进程不会影响到父进程
Linux当中的权限问题
Linux权限的概念
Linux下有两种用户,分别是普通用户和根用户(root)。
超级用户在Linux系统下做任何事几乎都不会被限制,但是普通用户只能在自己的工作目录(/bin/xxxx)中工作,而且操作会受到很大的局限。
也就是说,普通用户的权限是没有超级用户大的,而我们有关权限的问题也基本上都是在针对普通用户。
那么,我们应该如何区分超级用户和普通用户呢?
如下:超级用户的提示符为#

普通用户的提示符为$

如何用户账号之间的切换
在进行一些操作时,就譬如以下代码
apt install zip
在普通用户下,会因为权限问题无法安装,那么这时,我们就需要使用超级用户进行安装了。
那么,我们这时就需要切换到超级用户了。
切换用户使用的是su指令
语法: su 用户名
功能: 用户切换
从普通用户切换到root用户,是需要输入密码的。

从root用户切换到普通用户,则不需要输入密码。

注意点:
1.这个指令也可以用于普通用户之间的切换,但需要输入待切换用户的账号密码。
2.切换用户后,若想切回上次的用户,可用Crtl+D实现。
如何仅提升当前指令的权限
下面,我们来实现提升当前指令的切换,而不需要切换到超级用户
语法: sudo 指令
功能: 提升当前指令的权限
下面,介绍下passwd指令
语法: passwd 用户
功能: 修改用户的密码
那么,我们作为普通用户,理应是没有权限修改别的普通用户的密码的。
这时,我们就需要使用sudo提升权限。

我们发现,我们没有权限修改别的普通用户的密码,使用了sudo之后,需要我们输入自己的密码,这样可以让我们对自己的操作负责。
但,我们输入自己的密码了之后发现,我们并没有在sudoers的文件中,那么,我们应该如何做呢?
如何将普通用户添加到被信任列表
首先,我们应该切换到根用户去。
su root
切换到根用户后,我们使用vim打开文件sudoers
vim /etc/sudoers
之后,模仿上面的语法,添加我们的用户名即可。

添加完毕后,testbash就可以使用sudo权限了。

Linux权限管理
下面,我们介绍权限管理的相关知识。
文件访问者的分类
对于用户而言,权限可以分为以下三大类:
- 文件和目录的拥有者 (文件拥有者)
- 文件拥有者所在的组的成员 (文件所属组)
- 其他用户 (other)
一般而言
- 对于某一个文件而言,其拥有者、所属组和other都是由根用户和普通用户扮演的。
- 在Linux当中,所有用户都要隶属于某一个组,哪怕这个组就只有你一个人。(此时你的名字就是组名)
那么,为什么会有所属组这个东西呢?
假如,两个小组要开发同一个项目。你们彼此之间是竞争关系,那么,你的代码应该是只能让组内人看到的,并不能被另一个组看到。
因此,我们需要有所属组的概念,让你的代码不仅你能看到,而且你的小组团队也能看到,而别的人看不到。
于是,我们就可以设置文件为拥有者和所属者可见,而other不可见。
下面,我们来见一见这个东西。
我们可以使用ll指令来查看某一个文件或者文件目录的拥有者和所属组

ps: 除了拥有者和所属组之外的人为other
文件类型和访问权限
权限涉及到某个具体的文件来说,我们还需要讨论文件的属性。
对于文件而言,我们需要知道文件类型,以及文件是否具备可读、可写和可执行的属性。
在使用指令ls -al或者ll时

我们发现,最前面有10个字符,这十个字符中的第一个字符代表的就是该文件的类型。
如上图,以d开头的字符就代表是目录;以-开头的字符代表的就是普通文件。

下面,我们列举出不同的字符代表的文件类型
- -代表普通文件
- d代表目录
- l代表链接文件(类似于快捷方式/图标)
- b代表块设备文件
- p代表管道文件
- c代表字符设备文件
- s代表套接口文件
PS: 在linux中,文件类型与文件的后缀无关,只和最前面的一个字符有关。
但是,剩下的9个字符是什么意思呢?
剩下的9个字符每3个为一组,分别代表着拥有者、所属组和other所具有的权限。

下面是三个字符分别代表的意味:
- r 可读
- w 可写
- x 可执行
这三个字符处的字符若是“-”,则代表不具备对应位置的权限。
文件权限值的表示方法
文件权限值有两种表示方法
字符表示法
我们用ll打印时用的表示法就是字符表示法。
| 字符表示法 | 说明 |
|---|---|
| - - - | 无权限 |
| - w - | 仅可写 |
| - - x | 仅可执行 |
| r – | 仅可读 |
| r w - | 可读可写 |
| r - x | 可读可执行 |
| - w x | 可写可执行 |
| r w x | 可读可写可执行 |
除此之外,还有一种表示方法:二进制表示法
二进制表示法
其实,字符表示法中每一个字符的位置都有两种可能,分别是真和假。因此我们可以将三个字符转化为三个二进制位,而三个二进制位刚好是一个八进制数,因此,我们可以用下面的方法表示

文件访问权限的相关设置方法
文件是有权限的,那么自然应该有办法能够修改文件的权限。
如何改变文件的访问权限
chmod指令就是用来修改文件权限的。
语法: chmod 选项 权限 文件名/目录
功能: 设置文件的访问权限。
常用选项: -R 递归修改文件权限
chmod指令是有两个修改文件权限的方式的。
方式1: 用户符号 +/-/= 权限字符
- +代表增加权限
- -代表取消权限
- =代表赋予权限
用户符号:
- u:拥有者
- g:所属组
- o:other
- a:所有用户
实例:
chmod o=rwx proc
chmod o=rwx,u-w proc
方式2: 三位八进制数字
第一位代表u,第二位代表g,第三位代表o
如下实例:
chmod 710 proc
三个八进制数字分别代表ugo,
7:u 111 rwx
1:g 001 --x
0:o 000 —
如何改变文件的拥有者
语法: chown 选项 用户名 文件名/目录名
功能: 修改文件的拥有者
常用选项: -R

PS: 请注意,这个需要root权限才可以使用,否则需要提权。
也可以使用这个指令同时修改拥有者和所属组。实例如下:
chown root:root proc
拥有者和所属组之间用冒号隔开
即 拥有者:所属组
如何改变文件的所属组
语法: chgrp 选项 用户名 文件名/目录名
功能: 修改文件的所属组
常用选项: -R

文件默认权限
我们发现,在我们新创建了一个文件或文件夹后,它都有其默认的权限。
实际上,新建文件的默认权限为0666,新建目录的默认权限是0777。其中第一位的0是特殊权限,暂时不用管。后面的三位就是默认权限。
那么我们翻译下默认权限:
文件:rw-rw-rw-
目录:rwxrwxrwx
实际上,结果如下:

我们发现这个这和我们预测的权限是不同的,这是因为我们创建出来的文件和目录的权限还要受到umask的影响。现在我们假设默认权限是mask,那么我们实际创造出来的文件权限是:
mask&(~umask)
那么,umask的值应该如何查看呢?
语法: umask 权限值
功能: 查看或者修改掩码值(umask)
指令:umask
作用:查看掩码
指令:umask 000
作用:设置掩码为000


普通用户的掩码是0002;根用户的掩码是0022.
下面,我们以普通用户为例,计算权限值:

下面介绍两个比较特殊的掩码:
umask 000
作用:创建出来的文件权限即默认权限
umask 777
作用:创建出来的目录是无权限
目录的权限
对于一个文件,可读可写可执行的属性对应的操作我们都知道,但是对于目录来说,则不然。
- 可读:有了可读权限才能用ls查看文件内容
- 可写:有了可写权限,才能在目录中创建或删除文件
- 可执行:有了可执行权限,才能cd进去
那么,如果遇到以下的问题:
只要用户具有了目录的可写权限,就可以删除目录当中的文件,但是这个用户如果不拥有这个目录当中文件的可写权限,这又会怎么样呢?

我们发现,我们现在是拥有这个目录的可写权限的,但是我们却没有test的可写权限。但是我们依然能够删除这个文件,因此这样显然不合理。
那么,为了解决这个问题,Linux中引入了一个概念:粘滞位
粘滞位
语法: chmod +t 目录名
功能: 给目录加上粘滞位。
当用户给某一个目录加上粘滞位后,该目录的权限值的最后一位会变成"t"。
此时,若另一个用户有该目录的可写权限也无法删除该目录下没有可写权限的文件。
如下:设置了粘滞位的目录

这时,我们发现,我们即便有目录的可写权限,也无法操作目录内的文件了。

当一个目录被设置为粘滞位时。能够删除目录中文件的用户只有:
1.root用户
2.文件拥有者
3.目录拥有者

691

被折叠的 条评论
为什么被折叠?



