不用心做一件事情,你永远不知道自己有多么的强大!
一、shell命令以及运行原理(centos7下,shell为命令行解释器bash)
1. 什么是shell(Kernel外层的软件层)?
我们将输入指令的行这个叫做命令行,我们每输入一个指令,他就会帮我执行这个指令,这个指令的执行其实就是由一个叫shell的东西帮我们执行的
当我们远程登录到我们的云服务器时,系统就会自动给我们关联上bash这个程序,这个程序被称为命令行解释器shell
操作系统内核Linux Kernel,作为一名用户来讲,并不是直接访问这个内核的,因为这不安全,并且Linux也不想让你这么用,所以在内核的外层又包裹了一层软件层,我们将这个软件层称之为shell,也叫做外壳程序,命令行。
我们在操作windows时,用的是图形化界面,windows GUI实际上也属于一种外壳程序
,他把用户的输入操作,通过点击或者通过指令的方式收到,然后外壳程序将收到的指令传递给操作系统,操作系统对指令进行处理,处理完后将结果返回到外壳程序,也就是给到用户
1.将使用者的命令翻译给核心(kernel)处理。
2.同时,将核心的处理结果翻译给使用者
2. shell的交互方式+存在意义
上一波概念: (看看就行)
在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(command interpreter,命令解析器)。它类似于DOS下的COMMAND.COM和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。
传统意义上的shell指的是命令行式的shell,以后如果不特别注明,shell是指命令行式的shell。
shell提供了你与操作系统之间通讯的方式。这种通讯可以以交互方式(从键盘输入,并且可以立即得到响应),或者以shell script(非交互)方式执行。shell script是放在文件中的一串shell和操作系统命令,它们可以被重复使用。本质上,shell script是命令行命令简单的组合到一个文件里面。
交互式shell和非交互式shell:
交互式模式就是shell等待用户的输入,并且执行用户提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当用户签退后,shell也终止了。
shell也可以运行在另外一种模式:非交互式模式。在这种模式下,shell不与用户进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了。
shell存在的意义是什么呢?
a.帮忙进行命令行传递和返回结果
b.保护操作系统,拦截某些非法指令的非法请求
利用shell解析我们输入指令,我们也可以通过创建子进程来进行执行(当然这是后话了)
3. windows GUI对比Linux shell(都是Kernel外层的软件层)
对比windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)。
shell 对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运行出结果,通过shell解析给用户。
划重点:
这应该很好理解嘛,比如博主现在喜欢上一个漂漂亮亮的女孩子,但是呢,博主是个感情小白,只会努力提升自己,没心思考虑这些东西,所以博主不敢和女孩子交流,那怎么办呢?我会通过一个中间人,这个人可能就是那个女孩子的闺蜜,来传递我对她的爱慕之情。结果你猜怎么着?那个漂漂亮亮的女孩子和博主是相同的情况,她也不敢和我交流,那她也通过她的闺蜜来向我传递她对我的崇拜与仰望之情,毕竟博主这么优秀嘛,有女孩子喜欢也很正常啊。(骗你们的,博主其实是个单身很长时间的单身狗,555).
在这个故事情节里面,博主就是用户,闺蜜就是shell,那个女孩就是OS Kernel,我们的传递不能直接面对面交流,只能通过shell进行命令的解析,然后传递给对方。
二、Linux权限概念
1. 权限的抽象理解
权限概念:a.限制人的b.访问的对象天然可能没有这种“属性”。
权限也可以理解为一件事情是否允许被谁“做”
权限=人+事物属性(有些事物天然可能就没有这样的属性或有这样的属性)
上面的事物,我们在linux下谈的就是文件(现阶段)
2. Linux上的用户分类+身份切换+角色划分
2.1 root和普通用户
a.root,超级管理员 – 几乎可以干任何事情 –
b.普通用户
2.2 身份切换(su 或 su-)
用户如何切换的问题
su 就可以切换到root用户,如果想要回到普通用户,crtl+d就可以退出登录了,su只是单纯的进行了身份的切换,工作的目录并没有发生改变
su -相当于让我们的root重新登录,默认处在我们的家目录下,也就是/root
我们可以利用root的身份来访问其他用户,如果用普通用户的身份访问的话,你是不知道那个用户的密码的,用root就可以省去这个步骤了
对单条指令进行提权,某些指令在操作时,会显示权限不够,指令请求失败,这时如果要切换到root用户来进行访问的话,有些太麻烦了,因为我们只需要对一条指令进行提权,没必要再切换成root用户来访问。
这时我们就可以将sudo+command的方式来对指令进行提权,注意我们这里输入的是普通用户的密码,并非root用户的密码
2.3 角色划分
1.文件拥有者: 文件是谁的
2.文件所属组: (朋友圈分组)
假设我们现在有这么一个场景,如果没有文件所属组这样的概念的话,对于文件来说,那他就只有文件拥有者和other这两种身份了,例如现在马组长想看看小王写的
代码怎么样,然后test.c的拥有者是小王,由于马组长没有读test.c文件的权限,小王被迫就给马组长开了一个other能够看test.c文件的这么一个权限,结果呢?
这时候就出事了,由于刘组长和小李(小王的竞争对手)他们对于test.c文件来说也都是other,此时他们作为other的身份都能看到你的代码了,这咋办呀,竞争不过B组了,绩效奖金也没了,自己的代码还被偷了,你说憋屈不憋屈?
所以如果没有文件所属组的话,这是一件非常不合理的事情,就类似于你发朋友圈,你想给部分人看,不想给某些人看,结果你就给other开了一个能够看你朋友圈的权限,所有人都能看到了,呃呃呃,这真的令人很生气啊,怎么可以这样捏?所有就出来个朋友圈分组这么一个东西,解决你的需求。
故事后续: 小王一看这可不行啊,立马就开了一个test.c的文件所属组,把他们A组的成员都拉进去,还有他的马组长,这样一来,他们A组成员奋发向上,终于做出来的微信产品超过了B组,刘组长和小李同志欲哭无泪,小王也因为创造出文件所属组这样的概念,被公司领导提拔,走上了迎娶白富美的道路。
这也正是文件所属组存在的意义,便于我们对组内进行管理
3.文件的other: 文件不是谁的
2.4 root&&普通用户&&拥有者&&所属组&&other的关系
在这个世界上,人是要始终扮演不同的角色的,你可以是一个程序员,也可以是你母亲的好儿子,你女朋友的依靠,将来你孩子的父亲,你孙子的爷爷等等,所以人存在于这个世界上是要始终扮演不同的角色的
root和普通用户就类似于人,拥有者、所属组、other就是角色,root可能是拥有者、所属组,普通用户可能是拥有者、所属组、other
3. Linux的文件属性
3.1 Linux下的文件类型划分
一个文件可以有的属性是rwx,读、写、执行
文件类型和文件权限:
其中包括文件大小单位为字节,文件创建或最近修改的时间
我们现在来分析一下这些信息都分别代表什么含义,首先倒数第一排,我们称之为文件名,windows下文件都会有后缀名,并且是以后缀名来区分各个文件,我们Linux操作系统可不这么划分,Linux不会以你的文件后缀来区分这些文件,他会以文件属性中第一列中的第一个字符来区分文件类型。
还会包括文件大小,单位为字节,和 文件创建或最近修改的时间
-: 普通文件,文本,可执行文件,归档文件(例如.tgz那个压缩包就是归档文件)等
d: 目录
b: 块设备,block,例如磁盘
c: 字符设备,键盘或显示器
p: 管道文件
s: 网络socket文件
l: 链接文件 link
拿我们创建文件时,他的后缀名有什么用呢?我该如何看待这些后缀名呢?
a.你想用就用,可以给人看
b.将后缀看作文件名的一部分
我们下面来给大家演示一下对于上述的理解,通过下面这张图片你可以看到,在我编译test.c文件之后产生的可执行程序a.out,我们不停的改动他的后缀名,a.exe a.txt等等,当我们运行的时候,他们都会产生hello world的运行结果。
这也就能说明我们Linux在看待a.out这样的文件的时候,是不管他的后缀名的,爱你怎么改动这个后缀名呢,运行的时候都是一样的
但是如果我们将test.c改为test.txt时,情况就会不一样了,通过cat可以看到,确实test.txt里面的代码我们没有改动,但是当我们通过gcc编译器编译时,shell告诉我们文件是不能被识别的,这时可能我们产生疑问了就,不是后缀名加不加都没关系么?
你这里为什么不能编译啊?怎么回事呢?
如何来理解这个问题呢?
其实这是两码事,我们Linux操作系统可以不管这些文件的后缀,但并不代表操作该文件的软件或其他编译器不关心这些后缀,例如我们这里的gcc,他可无法识别你这.txt后缀的文件,所以它并不能够编译你这个文件
3.2 Linux下的文件权限
3.3 文件权限的更改: chmod u/g/o 加或减 r/w/x(a±可以帮助我们批量化处理权限的添加和去除) + 利用八进制方案表示(一个八进制位代表一个角色的权限,八进制大小代表权限的拥有或去除)
一般而言:要改一个文件的权限,必须是这个文件的拥有者或者是root 才可以改这个文件的权限
因为我(root)是test.txt文件的拥有者,所以我现在具备修改它权限的能力。
我们现在就给test.txt文件的所属组加上了可写入的权限
我们现在可以给cmd.txt的所属组一次性加多个权限(可写入和可执行)
我们现在也可以给不同的人加上不同的权限,利用逗号便可以完成此操作。
当然取消权限的话把+改成减号就行,我们这里也就不放图片给大家演示了。
我们现在也可以给所有人加上某个或多个权限,省下我们每次用逗号一个一个加权限。
也就是批量化处理权限的添加和去除
我们现在利用八进制方案对test.txt文件的权限做出更改,去除他的三个角色的所有权限,这个八进制方案还是比较好用的,我们每一个用户的权限位正好能代表八进制的数字。
3.4 有和没有权限是什么区别
例如我现在是一个文件的拥有者,但我当前是没有任何权限的,所以即便这个文件是我的,但是很遗憾,你无法读取这个文件,权限拒绝,因为权限就是来约束普通人的,除非你是一个root用户
例如下面因为我只是个普通人,所以我无法打印test.txt的内容
当我切换为root用户时,情况就不一样了,我就可以打印出来test.txt文件的内容了
权限是用来约束普通人的,root怎么可能被约束呢?
3.5 Linux文件拥有者,所属组的切换(chown 和 chgrp)
在对文件的拥有者或所属组进行修改时,我们有两种方法,一种就是用sudo指令进行提权,然后修改。另一种就是利用root的身份进行修改。
chgrp与chown不同的是,chgrp允许普通用户修改文件所属的组,只要该用户是该组的一员。
本不属于wyn的test.c文件,只有root这样的身份才能讲test.c这个文件硬塞给wyn,都不问问wyn是否接收,直接就强制给到用户wyn了。
当你想把一个东西给别人的时候,要不要征得别人的允许?所以普通用户是没有改文件拥有者这样的权限的。强制给你文件的用户只能是root用户
拥有者、所属组更改后,other也变了,所以other不用特意改。
3.6 对指令提权产生的一个疑问(对指令提权用sudo,后面文章再讲产生的疑问)
我们知道,如果我们当前对于某条指令没有权限的话,我们是可以通过sudo进行提权的,此时需要我们输入普通用户的密码,这里其实就会产生一个疑问了?
如果我们对于没有权限的指令,想要操作的话,我们显然只需要普通用户的密码和sudo指令就可以完成任务了,那还需要root用户做什么呢?他的功能完全被代替了啊。
这个问题我们留到后面去讲
4.Linux的默认权限+目录权限+粘滞位
4.1 file指令(查看文件类型)
ChildDir是一个目录,normal.txt是一个空文件,重定向之后,normal.txt变成一个文本文件
test.c是一个C源代码文件
a.out是一个可执行程序
dir.tgz是一个使用gzip压缩算法的.tgz压缩包
4.2 目录的权限(可进入,可创建,可删除,可查看,rwx)
如果我们要进入一个目录,只需要一种权限,就是可执行权限 – x
对于目录来讲,r意味着,在没有r权限的目录下,我们无法查看当前目录下的文件名和文件属性。
对于目录来讲,w意味着,在没有没有w权限的目录下,我们无法直接在该目录下创建新文件,并且删除文件也不行。
所以,能够在特定目录下,创建或者删除文件是由该目录的w权限所决定的。