Shell的运行原理
Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。 而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel? 从技术角度,Shell的最简单定义:命令行解释器(command Interpreter)主要包含:
- 将使用者的命令翻译给核心(kernel)处理。
- 同时,将核心的处理结果翻译给使用者。
对比windows GUI,我们操作windows不是直接操作windows内核,而是通过图接口形,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)。
shell 对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结
果在通过内核运行出结果,通过shell解析给用户。
- 帮助理解:如果说你是一个闷骚且害羞的程序员,那shell就像媒婆,操作系统内核就是你们村头漂亮的 且有让你心动的MM小花。你看上了小花,但是有不好意思直接表白,那就让你你家人找媒婆帮你提亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给小花,而我们找到媒婆姓王,所以我们叫 它王婆,它对应我们常使用的bash。
具体图像理解
Shell的运行原理
1)创建子进程,让子进程进行命令行解释
2)子进程出现任何问题,都不影响父进程Shell
对比到Windows中当中就是,我们每运行一个程序就是创建一个子进程,例如:登录微信,qq。而这些子进程当中任何一个进程出现问题都不会影响父进程,例如,当你的qq出现卡死(程序异常)或你的qq被关掉(程序终止),但其他子程序仍然可以运行
注意:Shell只是所有外壳程序的统称,例如在centos7当中的外壳程序名叫bash
Linux权限的概念
Linux下有两种用户:超级用户(root)、普通用户。
超级用户:可以再linux系统下做任何事情,不受限制
普通用户:在linux下做有限的事情。
超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。
如何实现用户账号之间的切换
命令:su [用户名] 或者 su - [用户名]
功能:切换用户。
例如,要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root用户的口令。
从root切换为普通用户
从普通用户切换为root
注意:
1)从普通账号切换为root账号时,指令当中你的root可以省略,因为root账号只有一个,并且su默认就是切换到root
2) 该用户也可以从一个普通用户切换为另一个普通用户,输入待切换用户的密码就可以了
3)切换用户之后,若想切回上次的用户,可通过Ctrl + D或exit实现
如何提升指令的权限
在某些情况下,我们只想提升当前指令的权限,那么没必要切换到超级用户
语法:sudo指令
功能:提升当前指令的权限
例如,我现在要以一名普通用户的身份,修改另一个普通用户的账号密码
当你输入密码之后,可能会得到以下提示
出现该提示就说明你没有被超级用户(root)添加到信用列表当中,所以该指令的权限得不到提升,一般都不会让普通用户更改普通用户的权限吧,那岂不是人人都是root,只有当你被超级用户添加到信任列表之后,你才拥有提升当前指令权限的功能
Linux权限的管理
文件访问者的分类(人)
文件和文件目录的所有者:u---User(文件拥有者)
文件和文件目录的所有者所在的组的用户:g---Group(文件所属组)
其它用户:o---Others(other)
这里注意:
1)对于某一个文件来说,拥有者,所属组和other就是由超级用户(root)和普通用户所扮演的角色
2)所有角色都要隶属于某一个组,哪怕这个组只有你一个人(这时,你可以设置你的用户名为组名)
那为什么会有这个所属组的概念?
在某个公司中,这个公司有两个小团队在同一个Linux服务器上进行者同一个项目的开发(赛马模式),而你就是A组当中的一员,你创建了一个文件,这个文件只有你(拥有者)能看到或者其他人(other)也能看到,而你希望的是你自己和你的小组成员能看到,剩下的人看不到
于是就有了所属组这个概念,你可以将你的小组成员的权限设置为所属组,而other不可见,这样就可以使团体协作更加灵活
我们可以通过指令ll来查看某一文件或文件目录的拥有者和所属组
注:除了文件拥有者和文件所属组之外都叫other
文件类型和访问权限
文件类型和访问权限(事物属性)
权限涉及某个具体的事物来说,我们还需要讨论事物本身的属性,以及是否具有可读,可读,可执行的属性
通过指令ll我们可以看到前面有一串字符,这字符串实际上就代表着该文件的类型和属性
可以看到上图有一堆信息,那么它们分别对应什么意思呢?
rwx分别代表的意思是:
r:代表该用户可以对文件读操作
w:代表该用户可以对文件进行写操作
x:代表该文件可以执行
-: 该用户没有这个位置的权限
不同的字符代表不同的文件类型:
1)d:文件夹
2)-:普通文件
3)l:软链接(类似Windows的快捷方式)
4)b:块设备文件(例如硬盘、光驱等)
5)p:管道文件
6)c:字符设备文件(例如屏幕等串口设备)
7)s:套接口文件
注:在Linux中文件类型于文件后缀无关
文件权限值的表示方法
1) 字符表示方法
ll指令打印文件权限值时的表示方法就是字符表示法
字符表示法 | 说明 |
r-- | 仅可读 |
-w- | 仅可写 |
--x | 仅可执行 |
rw- | 可读可写 |
r-w | 可读可执行 |
-wx | 可写可执行 |
rwx | 可读可写可执行 |
--- | 无权限 |
2)八进制表示法
字符表示法中的每一个字符所在位置所表示的结果只有两种可能,要么为真要么为假,因此我们可以将这三个字符换位三个二进制位,进而换为一个八进制为进行表示
权限符号(读,写,执行) | 八进制 | 二进制 |
r | 4 | 100 |
w | 2 | 010 |
x | 1 | 001 |
rw | 6 | 110 |
rx | 5 | 101 |
wx | 3 | 011 |
rwx | 7 | 111 |
--- | 0 | 000 |
文件访问权限的相关设置方法
如何改变文件的访问权限
语法:chmod 选项 权限 文件名或目录名
功能:设置文件的访问权限
常用选项:
R -> 递归修改目录文件的权限 说明:只有文件的拥有者和root才可以改变文件的权限
chmod指令权限值得格式
① 用户表示符+/-/=权限字符
+:向权限范围增加权限代号所表示的权限
-:向权限范围取消权限代号所表示的权限
=:向权限范围赋予权限代号所表示的权限
用户符号:
u:拥有者
g:所属组
o:其它用户
a:所有用户
若要同时设置不同类用户的访问权限,则需用逗号隔开
我们还可以使用八进制的数字来设置对应的权限值
将对应的八进制转换为二进制,进而设置对应的权限值
如何改变文件的拥有者
语法:chown 选项 用户名 文件名或目录名
功能:修改文件的拥有者
常用选项:-R 递归修改目录文件的拥有者
注意:修改拥有者需要root账户,或者使用sudo给这条指令进行提权
使用chown指令同时修改文件的拥有者和所属组,将拥有者和所属组的用户名用冒号隔开即可
如何改变文件所属组
语法:chgrp [参数] 用户组名 文件名
功能:修改文件或目录的所属组
常用选项:-R 递归修改文件或目录的所属组
注意:修改所属组也需要进行权限提升或者使用root身份进行
如何修改文件的掩码
我们查看新创建的文件或者目录它们都有自己默认的权限
实际上,新建文件的默认权限为0666,新建目录的默认权限为0777。其中第一位的0与特殊权限有关,这里就不深究了,而后面三位就是权限的八进制数值表示方法,我们将其翻译为字符表示方法
但实际上你会发现,你所创建出来的文件和目录的权限值并不是我们所翻译出来的值原因就是创建目录或文件的时候还会受到umask的影响,假设默认权限是mask,则实际创建出来的文件权限是:mask&(~umask)
umask
功能: 查看或修改文件掩码
新建文件夹默认权限=0666
新建目录默认权限=0777
但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。原因就是创建文件或目录的时候还要受到 umask的影响。假设默认权限是mask,则实际创建的出来的文件权限是: mask & ~umask
格式:umask 权限值
说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为0022,普通用 户默认为0002。
所以我们实际创建出来的文件和目录的权限值还需要进一步换算才能得出,首先我们将掩码的后三位八进制换算为二进制,然后对其进行按位取反
将文件和目录的默认权限值分别与它进行按位与操作
通过计算最终可以得到文件和目录真正的默认权限
新建文件:rw- rw- r--
新建目录:rwx rwx rwx
因此我们也可以通过修改umask来设置文件的访问权限
目录的权限
对于文件来说,其可读可写可执行的属性我们都知道分别代表着什么对应的操作,那对于目录来说可读可写可执行又代表着什么呢?
1)可读权限:如果用户没有该目录的可读权限,则无法通过ls指令查看目录中的文件内容
2)可写权限:如果用户没有该目录的可写权限,则无法通过一系列指令在目录中创建文件或删除文件
3)可执行权限:如果用户没有该目录的可写执行权限,则无法通过cd指令进入到目录当中
那么这就会引发一个问题:
只要用户拥有某目录的可写权限,就可以删除该目录当中的文件,而不论该用户是否拥有该文件的可写权限,这显然是不合理的
为了解决这个问题Linux中引入了粘滞位
粘滞位
语法:chmod + t 目录名
功能: 该目录加上粘滞位
当一个用户将某一个粘滞位后该目录的权限值最后一位会变成字符 “t”
此时计算另一个用户有该目录的可写权限也删除无法删除该目录下的文件
当一个目录设置了粘滞位,则该目录只能由
1)超级用户删除
2)该目录的拥有者删除
3)该文件的拥有者删除
注意:虽然目录被加上了粘滞位,但如果用户有该目录的可写权限,则不影响其在该目录下创建文件