文章目录
1. shell命令以及运行原理
Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel?
从技术角度,Shell的最简单定义:命令行解释器
它的作用:将使用者的命令翻译给核心(kernel)处理。同时,将核心的处理结果翻译给使用者。
对比windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)
shell 对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运行出结果,通过shell解析给用户。
我们centos 7常用的命令行解释器(shell),叫做bash。shell就是个统称,而bash是其中的一款。
外壳存在的最大意义:
1.shell降低操作os的成本
2.外壳保护os系统
2. Linux权限
2.1 Linux中的用户分类
Linux下有两种用户:超级用户(root)、普通用户。
超级用户:可以再linux系统下做任何事情,不受限制。
普通用户:在linux下做有限的事情。
超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。
root和Linux下的普通用户都要设置密码。建议不要把root密码和普通用户的密码设成一样的。
如果,我们想看当前是什么用户,我们可以这样:
如果,我们想从普通用户切换到root用户,我们可以这样:
这里输入密码是不显示的,提高了安全性。
如果,我们想切换回去,我们可以Ctrl+d,它会出现logout
这样就回去了。或者我们用exit:
要从root用户切换到普通用户user,则使用 su user。不需要密码。
要从普通用户切换到普通用户user,则使用 su user。需要密码。
2.2 Linux权限管理
2.2.1 权限的理解
1.什么是权限?
在我们的生活中,我们也会遇到一些权限方面的问题。
比如说,我们在在某APP里看视频时,如果没有VIP那么视频就会有广告,如果有VIP视频就会没广告。
这就是:对人的一种约束,或者说对人进行了一下分类。
第二,如果我们想看视频,可以在手机,电脑,电视上进行观看。但是不能在收音机里看。不管用什么方法,我们都不能在收音机里看视频。
这就是:需要对应的事务具有特定的属性。
而在Linux上,文件的权限也分这两种情况:
1.这个文件谁能访问,谁不能访问
2.对应的文件应该具备的某种属性:r:读,w:写,x:执行
所以权限的概念以及操作都是围绕着人和文件属性来展开的。
2.2.2 文件访问者的分类(人)
在Linux系统中,人分为三类:
1.文件和文件目录的拥有者:u—User
2.文件和文件目录的拥有者所在的组的用户:g—Group
3.其它用户:o—Others
这样像黄色框框起来的就是文件和文件目录的拥有者。蓝色的框子就是文件和文件目录的所属组。而除了拥有者和所属组外,其它的都认为是其它用户。
可能有的人这时就会问:root和普通用户和这个有什么关系?
root和普通用户可能是拥有者,可能是所属组,也可能是其它用户。它们的关系并不冲突,反而是相互补充的。
那么,为什么Linux会有所属组呢?
举个例子:在学校里,我们班分为两个小组,分别完成同一个项目,但是我们两个小组不能互相查看对方代码,小组内的成员可以互相查看。如果学校里只有一个服务器,此时如果没有所属组,那么我们只有拥有者和其它者,那么我是写的代码是拥有者,那么其他所有人都是其他者。这是不合适的,我们需要我自己写的代码可以查,可以改。同组的其他人只能查,不能改。
其它组的人不能查,也不能改。所以,我们需要所属组。
2.2.3 文件类型和访问权限(事物属性)
下面,我就来一一解释:
在前面,我们说过:文件=文件内容+文件属性。ls -l能显示文件更多属性。
而这些都是文件的属性。那么这些都是什么意思呢?我们来说一说。
第一列的第一个字符,叫做文件类型!
在Linux系统中不是以文件名后缀区分文件类型的,而是通过ls -l显示的第一个字符区分文件类型的!
-:是普通文件:含文本,源代码,可执行程序,第三方动静态库等
d:目录文件
这两种文件是我们平时看到的最多的。举个例子:
我们可以看到,不管什么后缀名为什么,Linux都可以运行。
那么,有的人就会问,那么gcc下可不可以都运行呢?
我们看到gcc下不行,可能这时就会产生疑惑,不是说不区分后缀名的吗?
我们说到是Linux下不区分后缀名,而gcc只是Linux上面使用的一个编译器软件。它是区分的。
还有一些其它类型的文件,我们先在这里看一下,后面的文章中再说:
l:软链接文件(类似Windows的快捷方式)
p:管道文件
b:块设备文件(例如硬盘、光驱等)
c:字符设备文件(例如屏幕等串口设备)
第一列,我们说完了,还剩下9列,我们每三个为一组的来说:
黄色的代表的是:拥有者权限。
蓝色的代表的是:所属组权限。
红色的代表的是:其它者的权限。
每一组,对应的权限的位置含义是确定的
每一组的第一列:只能是r(读)或者是-(不支持读)
每一组的第二列:只能是w(写)或者是-(不支持写)
每一组的第三列:只能是x(执行)或者是-(不支持执行)
这是不可能变的。
那么,如何描述test.c文件的权限呢?
这样描述:它的拥有者们可以读可以写,但不能执行。它的所属组们可以读可以写,但不能执行。而其它的只能读,不能写,也不能执行。
2.2.4 文件访问权限的相关设置方法
那么根据上面的知识,我们如果对文件的权限的操作,应该涉及到几方面呢?1. 修改文件的属性。2. 修改人。更准确的来说,是修改某些人的某种文件属性。
2.2.4.1 chmod
功能:设置文件的访问权限
格式:chmod [参数] 权限 文件名
chmod命令权限值的格式:
第一种方式. 用户表示符+/-权限字符
+:向权限范围增加权限代号所表示的权限
-:向权限范围取消权限代号所表示的权限
=:向权限范围赋予权限代号所表示的权限
u:拥有者
g:拥有者同组用
o:其它用户
a:所有用户
举个例子:
从这里我们可以看到,我们将拥有者的w(写)这个权限给取消了。
这里,我们将所属组的w(写)权限也给取消了。
这里,我们将所有的人都加上了w(写)这个权限。
我们也可以这样去写:
那么在这里,有一个问题:root用户受不受这些权限的限制呢?
我们来看:
从这里,我们可以看到我们从普通用户wyw转到超级用户root了,此时所有人的w(写)都没有权限。那么我们看看root用户受不受这些权限的限制呢?
从这里,我们就可以看出root用户并不受这些权限的限制。
第二种方式. 三位8进制数字
我们知道,每一个位置只有两种情况:要么是r,w,x,要么是-,-,-,所以如果是r,w,x,我们都认为是1(二进制),如果是-,我们就认为是0(二进制)。
所以,每一组都是三个,所以每一组都有三个二进制的0或1,三个二进制可以看作为1个八进制。所以就可以用三个八进制的数来表示你要修改的内容。
举些例子:
000代表的二进制也是000 000 000 ,所以全是-,没有这项权限。
333代表的二进制是011 011 011,所有的w(写)和x(执行)都有,而r(写)都没有。
2.2.4.2 chown
功能:修改文件的拥有者
格式:chown [参数] 用户名 文件名
从这里,我们可以看到,我们普通用户不能直接改文件的拥有者。但我们这里可以使用sudo来短暂的提升权限,以root身份去运行程序chown。
但是,我们现在看到系统执行sudo会报错,这个sudo需要解决一些配置问题,等一会再解决这个问题。那么还有没有什么其它解决方法呢?
首先,我们把普通用户改成root用户。
然后,我们再改它的拥有者。
这样就可以修改了。
2.2.4.3 chgrp
功能:修改文件或目录的所属组
格式:chgrp [参数] 用户组名 文件名
这个和上面的chown类似,sudo现在不能直接改文件的所属组,而是先改成root用户。
此时,test.txt文件的拥有者和所属者都是root了。
我们在这也验证了,其它用户(wyw)此时就不能读test.txt文件了。
如果,我们想同时一起把拥有者和所属组都改成wyw,那么我们也可以这样写:
2.2.5 sudo的配置
普通用户想要sudo提权需要获取root信任,应该怎么实现呢?
1. 首先切换到root用户下,申请设置存在/ect/sudoers中
2. 为sudoers配置文件添加写权限
系统配置sudo用户的一个只读配置文件。在root身份下执行 chmod +w /etc/sudoers命令为该文件添加写权限。
3. vim打开/etc/sudoers,找到下面的区域
加入如下配置:用户名 ALL=(ALL)ALL,保存并退出。
这样就可以使用了。
2.2.6 目录权限
首先,我们要想一个问题:如果我们要进入一个目录,需要什么权限呢?
我们用代码来验证一下:
从这里,我们可以看到,我将dir的拥有者权限的r权限取消了。我们再来看一下它能不能进入dir目录里。
从这里,我们可以看到,r权限不限制能否进入目录里。
在这里,我们把拥有者的w权限取消了,但是还是能进入目录里。所以,w权限不限制能否进入目录里。
从这里,我们就能清楚的看到:进入一个目录,需要的权限就是x权限。
从这些代码,我们可以看出:如果目录只没有r权限,允许进入,允许在该目录下创建(写入)一个文件,但不允许查看。
从这些代码,我们可以看出:如果目录只没有w权限,允许进入,允许在该目录下查看文件列表,但不允许创建(写入)一个文件。
如果同时没有rw权限,允许进入,但不允许创建和查看目录下的文件列表(注意:不是文件内容!文件的内容,是否可以查看,由文件自己的权限决定!)
那么,现在有一个问题:
如果,一个目录没有r权限,但是我知道目录下一个文件的文件名,而且这个文件具有r权限,那么我们可不可以读这个文件呢?
答案是:原则上是不能的。
原因是:在Linux下一切皆文件,那么目录也是文件。而文件=内容+属性。
如果,我们要访问文件,前提是我们需要找到它。Linux中我们是如何找到这个文件的呢?答案是:通过路径。那么通过路径,我们就需要访问目录下文件的名称,所以原则上是不能的。但是,实际上我们来检验一下:
但是从这里看到,它是可以被读取的。原因是:文件名和id之间是有对应的映射关系的,有可能被系统缓存了。
2.2.6.1 umask
下面,还有另外一个问题:
为什么我们创建目录的默认权限是:775,为什么创建的普通文件的默认权限是:664(不同的系统可能有差异)?
首先,我们要知道一点:
新建文件夹默认权限是:0666
新建目录默认权限是:0777
这里的0代表的意思是八进制。
但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。原因就是创建文件或目录的时候还要受到umask的影响。
umask:叫做权限掩码 功能:查看或修改文件掩码
所以,Linux中最终权限=默认权限" 去掉 " umask 中存在的权限。
超级用户默认掩码值为0022,普通用户默认为0002。前面第一个0,我们不要考虑,它是八进制的前缀。
所以,上面我们创建的普通文件的权限是这样来的:
创建的普通目录的权限是这样的:
那么,这里的" 去掉 "的意思是不是:简单的减法呢?我们来看:
我们就以这段代码来讲解:
首先,我们将umask改成了003,003的二进制为:000 000 011,然后普通的文件默认的权限值为:666,二进制为:110 110 110,减去000 000 011,结果应该为:110 110 011,转换为八进制为:663。
但是图中的结果为110 110 100,八进制为664。这是为什么呢?
所以,这里的" 去掉 "不是简单的减法,而是先将umask按位取反,然后两者再按位&。
为什么会要有umask这个东西呢?就是当我们的需求要一些特殊文件的权限。这个可能会用的上。
2.2.7 粘滞位
在Linux下可以存在一些目录,拥有者和所属组都是root,其它人允许以other的身份在该目录下进行文件的创建,读取,删除,修改等。
首先,我们用root用户在/home/wyw/code/下创建一个目录dir,并把这个目录改成777,这样other可以读,写,进入。
然后,我们将用户改成普通用户wyw,然后可以在这个目录里进行读和写。
那么其它的用户(wxw)也可以在dir目录下,进行读和写。
此时,我们将wyw用户的test.c文件的权限改成660,这样other(wxw)就不能r(读),w(写)test.c文件了。
同时,wxw用户的file.txt文件也做出一样的操作。这样other(wyw)就不能r(读),w(写)file.txt文件了。
确实,根据权限的规定,不能相互r,w,x了。但是,我们确可以删除other的文件:
那么,如果在共享的目录下,形成的临时文件。不允许除了我之外的人删除,那么我们可以给共享的目录加上粘滞位!
这个+t,就是加上粘滞位的意思。加上粘滞位还是可以进入目录里,r(读),w(写),这些都不影响。
此刻,wxw用户就不能删除wyw用户的文件了。
当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由:
一、超级管理员删除
二、该目录的所有者删除
三、该文件的所有者删除
2.2.8 file指令
功能说明:辨识文件类型。
语法:file [选项] 文件或目录…
像前面,我们是根据文件的第一位来查看文件的类型,但还是不够详细。而file指令可以详细的说明文件类型。
常用选项:
-c 详细显示指令执行过程,便于排错或分析程序执行的情形。
-z 尝试去解读压缩文件的内容。
到这里,权限的基本内容已经说完,一些更深的知识,我们后面再说。如果大家觉得这篇文章有帮助,可以点赞关注一下,感谢大家的支持!