不用心做一件事情,你永远不知道自己有多么的强大!
我们将输入指令的行这个叫做命令行,我们每输入一个指令,他就会帮我执行这个指令,这个指令的执行其实就是由一个叫shell的东西帮我们执行的
当我们远程登录到我们的云服务器时,系统就会自动给我们关联上bash这个程序,这个程序被称为命令行解释器shell
操作系统内核Linux Kernel,作为一名用户来讲,并不是直接访问这个内核的,因为这不安全,并且Linux也不想让你这么用,所以在内核的外层又包裹了一层软件层,我们将这个软件层称之为shell,也叫做外壳程序,命令行。
我们在操作windows时,用的是图形化界面,windows GUI实际上也属于一种外壳程序
,他把用户的输入操作,通过点击或者通过指令的方式收到,然后外壳程序将收到的指令传递给操作系统,操作系统对指令进行处理,处理完后将结果返回到外壳程序,也就是给到用户
1.将使用者的命令翻译给核心(kernel)处理。
2.同时,将核心的处理结果翻译给使用者
上一波概念: (看看就行)
在计算机科学中,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解析我们输入指令,我们也可以通过创建子进程来进行执行(当然这是后话了)
对比windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)。
shell 对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运行出结果,通过shell解析给用户。
划重点:
这应该很好理解嘛,比如博主现在喜欢上一个漂漂亮亮的女孩子,但是呢,博主是个感情小白,只会努力提升自己,没心思考虑这些东西,所以博主不敢和女孩子交流,那怎么办呢?我会通过一个中间人,这个人可能就是那个女孩子的闺蜜,来传递我对她的爱慕之情。结果你猜怎么着?那个漂漂亮亮的女孩子和博主是相同的情况,她也不敢和我交流,那她也通过她的闺蜜来向我传递她对我的崇拜与仰望之情,毕竟博主这么优秀嘛,有女孩子喜欢也很正常啊。(骗你们的,博主其实是个单身很长时间的单身狗,555).
在这个故事情节里面,博主就是用户,闺蜜就是shell,那个女孩就是OS Kernel,我们的传递不能直接面对面交流,只能通过shell进行命令的解析,然后传递给对方。
权限概念:a.限制人的 b.访问的对象天然可能没有这种“属性”。
权限也可以理解为一件事情是否允许被谁“做”
权限=人+事物属性(有些事物天然可能就没有这样的属性或有这样的属性)
上面的事物,我们在linux下谈的就是文件(现阶段)
a.root,超级管理员 – 几乎可以干任何事情 –
b.普通用户
用户如何切换的问题
su 就可以切换到root用户,如果想要回到普通用户,crtl+d就可以退出登录了,su只是单纯的进行了身份的切换,工作的目录并没有发生改变
su -相当于让我们的root重新登录,默认处在我们的家目录下,也就是/root
我们可以利用root的身份来访问其他用户,如果用普通用户的身份访问的话,你是不知道那个用户的密码的,用root就可以省去这个步骤了
对单条指令进行提权,某些指令在操作时,会显示权限不够,指令请求失败,这时如果要切换到root用户来进行访问的话,有些太麻烦了,因为我们只需要对一条指令进行提权,没必要再切换成root用户来访问。
这时我们就可以将sudo+command的方式来对指令进行提权,注意我们这里输入的是普通用户的密码,并非root用户的密码
1.文件拥有者: 文件是谁的
假设我们现在有这么一个场景,如果没有文件所属组这样的概念的话,对于文件来说,那他就只有文件拥有者和other这两种身份了,例如现在马组长想看看小王写的
代码怎么样,然后test.c的拥有者是小王,由于马组长没有读test.c文件的权限,小王被迫就给马组长开了一个other能够看test.c文件的这么一个权限,结果呢?
这时候就出事了,由于刘组长和小李(小王的竞争对手)他们对于test.c文件来说也都是other,此时他们作为other的身份都能看到你的代码了,这咋办呀,竞争不过B组了,绩效奖金也没了,自己的代码还被偷了,你说憋屈不憋屈?
所以如果没有文件所属组的话,这是一件非常不合理的事情,就类似于你发朋友圈,你想给部分人看,不想给某些人看,结果你就给other开了一个能够看你朋友圈的权限,所有人都能看到了,呃呃呃,这真的令人很生气啊,怎么可以这样捏?所有就出来个朋友圈分组这么一个东西,解决你的需求。
故事后续: 小王一看这可不行啊,立马就开了一个test.c的文件所属组,把他们A组的成员都拉进去,还有他的马组长,这样一来,他们A组成员奋发向上,终于做出来的微信产品超过了B组,刘组长和小李同志欲哭无泪,小王也因为创造出文件所属组这样的概念,被公司领导提拔,走上了迎娶白富美的道路。
这也正是文件所属组存在的意义,便于我们对组内进行管理
3.文件的other: 文件不是谁的
在这个世界上,人是要始终扮演不同的角色的,你可以是一个程序员,也可以是你母亲的好儿子,你女朋友的依靠,将来你孩子的父亲,你孙子的爷爷等等,所以人存在于这个世界上是要始终扮演不同的角色的
root和普通用户就类似于人,拥有者、所属组、other就是角色,root可能是拥有者、所属组,普通用户可能是拥有者、所属组、other
一个文件可以有的属性是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后缀的文件,所以它并不能够编译你这个文件
一般而言:要改一个文件的权限,必须是这个文件的拥有者或者是root 才可以改这个文件的权限
因为我(root)是test.txt文件的拥有者,所以我现在具备修改它权限的能力。
我们现在可以给cmd.txt的所属组一次性加多个权限(可写入和可执行)
我们现在也可以给不同的人加上不同的权限,利用逗号便可以完成此操作。
当然取消权限的话把+改成减号就行,我们这里也就不放图片给大家演示了。
我们现在也可以给所有人加上某个或多个权限,省下我们每次用逗号一个一个加权限。
我们现在利用八进制方案对test.txt文件的权限做出更改,去除他的三个角色的所有权限,这个八进制方案还是比较好用的,我们每一个用户的权限位正好能代表八进制的数字。
例如我现在是一个文件的拥有者,但我当前是没有任何权限的,所以即便这个文件是我的,但是很遗憾,你无法读取这个文件,权限拒绝,因为权限就是来约束普通人的,除非你是一个root用户
例如下面因为我只是个普通人,所以我无法打印test.txt的内容,
当我切换为root用户时,情况就不一样了,我就可以打印出来test.txt文件的内容了
权限是用来约束普通人的,root怎么可能被约束呢?
在对文件的拥有者或所属组进行修改时,我们有两种方法,一种就是用sudo指令进行提权,然后修改。另一种就是利用root的身份进行修改。
chgrp与chown不同的是,chgrp允许普通用户修改文件所属的组,只要该用户是该组的一员。
本不属于wyn的test.c文件,只有root这样的身份才能讲test.c这个文件硬塞给wyn,都不问问wyn是否接收,直接就强制给到用户wyn了。
当你想把一个东西给别人的时候,要不要征得别人的允许?所以普通用户是没有改文件拥有者这样的权限的。强制给你文件的用户只能是root用户
拥有者、所属组更改后,other也变了,所以other不用特意改。
我们知道,如果我们当前对于某条指令没有权限的话,我们是可以通过sudo进行提权的,此时需要我们输入普通用户的密码,这里其实就会产生一个疑问了?
如果我们对于没有权限的指令,想要操作的话,我们显然只需要普通用户的密码和sudo指令就可以完成任务了,那还需要root用户做什么呢?他的功能完全被代替了啊。
这个问题我们留到后面去讲
ChildDir是一个目录,normal.txt是一个空文件,重定向之后,normal.txt变成一个文本文件
test.c是一个C源代码文件
a.out是一个可执行程序
dir.tgz是一个使用gzip压缩算法的.tgz压缩包
如果我们要进入一个目录,只需要一种权限,就是可执行权限 – x
对于目录来讲,r意味着,在没有r权限的目录下,我们无法查看当前目录下的文件名和文件属性。
对于目录来讲,w意味着,在没有没有w权限的目录下,我们无法直接在该目录下创建新文件,并且删除文件也不行。
所以,能够在特定目录下,创建或者删除文件是由该目录的w权限所决定的。
我们新创建出来的普通文件normal.txt和hello.txt的默认权限都是664,普通目录new_dir的默认权限是775
1.默认权限:– 你看到的
2.起始权限:– 系统设定的
a.普通文件起始权限:666开始的(没有可执行x权限,普通文件你要什么可执行啊?)
b.目录文件起始权限:777开始的(rwx,能显示,能进入,能创建)
3.最终权限: 系统为了更好的控制文件权限,会有默认的(权限掩码umask)的概念。centos7下默认的掩码为0002,但第一个数字以我们现在的水平不太好理解,那就暂时不管他,所以二进制序列就是000 000 010
4.权限掩码: 在起始权限中,去掉在umask中出现的权限,不能影响其他任何权限!
结论:最终权限 = 起始权限 & (~umask)
110 110 110 &
111 111 101 =
110 110 100 – 664
按位与的结果正好就把倒数第二位的权限搞没了。
和1按位与,并不会改变它原本的值,无论原来是1还是0都不会变。
和0按位与,管你是什么都给你搞成0,也就是让起始权限的二进制序列的第二个比特位的结果一定变为0
我们讲umask的改为0007,之后创建两个普通文件和一个普通目录,在之前命名的基础上都加了个1
000 000 111 取反111 111 000,所以起始权限中的前3个比特位都是0,文件的最终权限就是660,目录的最终权限就是770
1.背景:在使用Linux的时候,未来很有可能会有一些共享目录,被所有的普通用户共享,用来保存普通用户产生的临时数据。这个文件可以只属于自己,也可以公开使用
我们的home目录就是由root管理员创建的
Linux下,作为一个正常用户,他的用户家目录是只对自己开放的,而不对任何人开放。
譬如下面的wyn和wyn1的用户家目录只有user拥有rwx的权限,所属组和other没有任何权限。
2.共享的目录通常都是由root来提供的,即使某个目录的拥有着和所属组都是root,但这也不影响,只要root将权限放开,其他普通用户均可以以other的身份来访问这个目录
如下面所示,作为普通用户wyn,即使目录bin的拥有者和所属组都是root,但root给other提供了r可查看,x可进入的权限,那我们作为other也是可以访问这个目录的
因为现在的根目录的拥有着和所属组都是root,而我们是一个wyn普通用户,所以对于根目录,我们就是一个other的角色,我们是没有w权限的,所以无法创建一个公共目录public,但我们可以切换成成root用户在下面创建一个public公共目录
这样我们就利用root的身份,在根目录下创建了一个public目录,这个目录的最终权限是755,111 101 101,这是因为在root身份下,umask掩码的值为0022,000 010 010
,所以起始权限777经过掩码的处理后,就变为了755.
我们现在将public目录的权限全部放开,那其实现在无论是什么用户,无论是谁,都可以在我们的public公共目录下,创建文件,对文件进行写入,查看public目录下的信息,什么的都可以进行了,因为root已经把public的权限给我们打开了,所以所有人都可以在public这个目录下,拥有对目录的rwx权限。
我们现在分别作为wyn和wyn1的身份在public这个公共目录下创建了两个普通文件,然后我作为wyn的身份想要看一下wyn1里面的内容,当然可以看到啦,因为wyn1文件的other是拥有可读r的权限的,但现在我想要以wyn的身份向wyn1文件中写入一些东西时,这就不允许了,因为wyn1这个文件对other这样的角色,只开放了r权限,没有开放w和x权限,所以wyn是不可以写入的,正如bash返回给我们的指令Permission denied权限拒绝。
但是wyn现在很不爽,喵的你个wyn1文件就给你自己和root所有权限开放,我作为wyn只能读取这个文件,凭什么?然后一气之下,wyn直接删除了用户wyn1的文件,为什么能删呢?因为public对所有角色的所有权限都开放了,只要对目录public有w权限,那么现在任何一个用户都可以随便删除public下的任何一个文件,因为public对三个角色都开放了w权限么,那无论什么身份的用户都可以在public目录下像删除谁就删除 谁,无论是删自己的文件,还是删别人的文件,没有任何权限约束,想怎么删就怎么删。
就像下面,我们就坏坏的把wyn1文件给删除掉了。
所以现在就有一个非常严重的问题摆在我们的面前,public目录下的文件被所有人共享的时候,受权限的约束,但是拦不住别人删我的文件!!!
这里起始有一个逻辑,就是为什么共享目录拦不住我们删除文件呢?因为目录的w权限本身就可以在目录下创建或删除文件,他是同时带有这两个权限的,而一个共享目录他是必须必须要拥有其他用户在里面创建文件的权限,所以他又必须带上w,带上w那也就意味着,其他用户可以随便删除文件了,这样无法化解的矛盾,就必须有人来解决,这个人就是+t,粘滞位的作用就引出来了。
我们现在利用root的身份对public的所有角色加上t粘滞位并且带上a选项,但可以看到只在public的other角色下的x位置变成了t,t就是该目录设置的粘滞位
指令:chmod +t public
加上我们的粘滞位之后,我们又想故技重施,但是这回我们删不了了,操作被拒绝了,因为我们的public共享目录是被设置了粘滞位的
设置粘滞位之后,共享目录public下的文件一般只能被两种人删除,一种是root,一种是文件的拥有者
起始也可以被目录的拥有者删除,但目录的拥有者一般就是root,所以我们上面才说,共享目录下的文件一般都是由root或文件的拥有者删除的。
权限的匹配规则是:只能匹配一个人,并且优先匹配拥有者,然后才是所属组,最重要的是他只会匹配一次。
1.Linux发展史
2.云服务器环境的搭建
3.ls/cd/pwd/whoami/touch/mkdir/rm/rmdir/bc/cal/date/wc/grep/more/less/head/tail/zip/unzip/tar/ll/clear/cat/man/echo/tree/nano/which/whereis/find/file/cp/mv/chmod/chgrp/sort/uniq/gcc/su/sudo/top/stat/uname/alias/umask/history/useradd/userdel/passwd/usermod/chown
4.Linux目录结构、重定向、管道、~、-、家目录、文件类型、目录权限、umask、粘滞位
5.权限、概念、用户(具体的人,角色)、chmod ugo±rwx or 八进制,chown chgrp更改角色