内容摘要
本文内容包括shell的运行原理,包括外壳程序的原理、理解、和意义,以及从两个方面对于权限的理解(人和事物的属性)、修改文件的权限,包括修改文件的拥有者、修改文件拥有者所在的组的用户以及修改文件的三类用户的访问文件的权限、最终权限与起始权限和umask的关系、以及粘滞位的作用和使用。
shell的运行原理
shell的运行原理:外壳程序
首先思考:我们作为操作者(用户)使用操作系统的过程,是在直接使用操作系统吗??
外壳程序的理解
不管是我们操作widows还是Linux,其实我们都不是在直接使用操作系统,在使用window时我们通过图形化界面进行访问操作系统,在Linux我们通过命令行进行访问,这里的图形化界面、命令行就是外壳程序。
外壳程序的意义
为什么我们要通过外壳程序进行访问操作系统,而不是直接访问操作系统呢??
Linux操作系统的内核是十分复杂的,我们直接进行访问操作系统的成本比较高
我们是人,是人就会犯错误,通过外壳程序可以帮我们规避错误,增加容错率,极大的减少了系统崩溃的概率
外壳程序的原理
将使用者的命令翻译给核心(kernel),然后将核心处理结果翻译给用户
权限的理解
权限的概念
通俗的来说就是是否被允许去做一些特定的事情的资格
权限的两个方面 人和文件的属性
对于人
第一方面:
分为普通用户和root用户,root用户也成为超级用户,相当于人身上的身份
对于普通用户:通常会受一些权限的约束,不同的用户可能会受不同的权限约束
对于root用户而言:几乎不会受权限的控制
举个栗子
比如一个人是字节的员工,那么他可以随意进出字节公司,但是他是进不去腾讯的大门的,他能够进入字节,是因为他是字节员工的身份,这个身份给予了他允许进入字节的资格,也就是说字节给了他权限,但是腾讯没有 。
第二方面:
通过文件访问者进行分类
通过文件访问者可以分为三类:文件和文件拥有者、文件和文件目录拥有者所在组的用户、其他用户三类
通过ls -l指令进行查看目录的详细信息
这里的的三个目录都是通过用户的身份进行创建的,所以目录的拥有者和目录拥有者所在的组的用户都是root。
这里解释一下拥有者所在组的用户的概念,如上图所示,创建文件或者创建文件目录的用户既然既是文件和目录的拥有者,也是文件和目录拥有者所在的组的成员,那么文件和目录拥有者所在的组的用户有什么作用呢??其实文件和目录拥有者所在的组还是十分重要的,假设我们以后步入企业,对于同一个项目,公司分配两个及以上的组进行研发,这两个组是竞争关系,如果没有文件目录拥有者所在的组,那么除了创建文件的用户,这个组的其他用户都成了其他用户,和另一个项目组的成员权限一样了,所以Linux引入了文件和文件目录拥有者所创建的组的概念,可以单独分配权限给这个组,完美解决了这种问题。
对于事物属性
文件类型和访问权限
文件类型
- d:目录
- -:普通文件
- l:软连接(相当于window下的快捷方式)
- b:块设备(硬件部分)
- p:管道文件
- c:字符设备文件(例如屏幕等串口设备)
- s:套接口文件
对于Linux来说文件类型只有通过以上类型来定义,和文件的后缀名无关,既然无关我们为什么在创建文件时还要定义后缀,这里的后缀有什么作用呢??对于Linux系统来说,没有任何作用,这里的后缀只是用来给用户看的。
我们通过gcc g++进行编译文件生成可执行程序要求我们需要特定的文件后缀,并不能说明任何问题,gcc g++相当于Linux下的程序。
权限
对于权限那一列,每三个字母为一组,分别是文件所有者的权限、文件拥有者所在组的用户的权限、其他用户的权限,字母 'r' 代表有读的权限、 字母 'w' 代表有写的权限、字母 'x'代表可执行权限,如果没有相对应的权限则在相对应的位置用 '-' 表示。每类用户的三个位置的字母不能够随意改变。
如上图所示,code目录的权限就是,对于文件拥有者来说,拥有可读可写可执行的权限;对于文件拥有者所在的组的用户来说,拥有可读可执行的权限,没有可写的权限;读于其他用户来说,也是拥有可读可执行的权限,没有可写的权限
目录权限的总结(易混淆)
- 进入目录:需要拥有可执行权限
- 查看目录下的文件列表:也就是ls指令,需要读权限
- 在目录下进行创建、删除目录或者文件:需要拥有写权限
修改权限
修改文件的拥有者
格式:chown + 将要修改成的成员名 + 被修改的文件名
修改文件的拥有者所在组的用户
格式:chown + 将要修改成的成员名 + 被修改的文件名
注意:这里进行修改文件的拥有者和拥有者所在组的对象,对于root用户而言是可以完成的,但是对于普通用户来说是需要进行权限提升的。
修改问文件被访问权限
-
用户加标识符法
修改文件拥有者访问文件时的权限
chmod u 运算符 权限字母 文件
修改文件拥有者所在组的用户访问文件时的权限
chmod p 运算符 权限字母 文件
修改其他人访问文件时的权限
chmod o 运算符 权限字母 文件
- 八进制法
通过二进制的八进制法进行修改文件权限,每类用户的权限都是由三个字符进行表示分别为r(-)、w(-)、x(-),当有相对应的权限时在相对应的位置记作1,否则记作0。例如上图中10.24code这个目录的用户权限分别用二进制进行表示时为101 111 101 ,用八进制进行表示为575。
我们可以用这种形式进行更改文件用户的权限
通过chmod将文件中各个用户的读、写、可执行权限全部打开。
最终权限与起始权限和umask的关系
新建目录的默认起始权限为0777
新建文件的默认起始权限为0666
通过创建一个目录和文件进行观察
通过创建文件我们可以看到,在没有任何修改的条件下,刚刚创建的目录的权限为775,文件权限为664,这和我们的结论有所不同,这是为何呢??这和umask值有关
那么最终权限和起始权限与umask的关系
凡是在umask中出现的权限都不应该在最终权限中出现
最终权限不是我们看到的通过减法进行实现的,而是起始权限和umask按位取反然后按位与得到的。
粘滞位
粘滞位的作用
当用户在同一个目录下,进行创建文件,通过粘滞位避免文件拥有者的创建的文件被除自己以外的用户删掉。
举个栗子:
通过超级用户root创建一个目录文件,并将文件目录对于各个用户的读写执行权限全部打开,方便后续各个用户进行,创建并储存文件
切换至一个普通用户,然后创建一个普通文件,并将文件对于其他用户的读写可执行权限全部不给予
切换至另一个用户,想要查看ys用户的文件,因为ys将文件对于其他用户的读写执行的权限全部不给予,wyt用户所以说不具备查看ystest.c文件的权限,因为查看不了,wyt用户直接执行将ystest.c这个文件进行删除,竟然删除成功了
这里解释一下为什么删除成功,文件是否能够被删除是由文件所在的目录的权限进行决定的,这里就会产生这样的疑惑,直接把目录文件对于其他用户的写权限直接进行不给予不就直接妥了吗?但是真的就是这样吗?将其他用户的写权限进行关闭,那么文件的拥有者也不在拥有写文件的权限。所以就需要粘滞位进行解决这个问题
粘滞位使用
格式:chmod +t 目录名
注意事项:
- 只能给目录进行使用粘滞位
- 粘滞位是谁设置的,只能谁取下
其他用户再进行删除时,就会删除失败。