一.shell外壳的理解
Linux严格意义上说的是一个操作系统,我们称之为"核心(kernel)",
但我们一般用户,不能直接使用kernel。
而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。
1.为什么需要有shell外壳的存在?
操作系统本身是需要易用程度和安全性的
而对于我们使用电脑的普通用户来说,我们是不能直接访问操作系统的
为什么我们不能直接访问操作系统呢?
因为对于我们绝大多数人来说,我们对于操作系统并不熟悉,如果允许我们直接访问操作系统,势必会出现一些错误,所以需要有一个中间者
2.什么是shell外壳?
这个中间者的核心工作就是
将使用者的命令翻译给核心(kernel)处理。
同时,将核心的处理结果翻译给使用者。
在Linux中这个中间者就是shell外壳
在windows中这个中间者就是图形化界面
shell外壳的本质就是一个执行起来的程序(进程),在系统启动期间一直存在
3.shell外壳的运行原理是什么?
1.当用户想要执行的指令有风险时(例如用户自定义的指令),shell都是通过创建子进程的方式去让子进程执行有风险的指令
2.对于低风险的指令,shell外壳会自己去执行
3.每一次你进行xshell登陆的时候,操作系统都要给你这个用户的当前登陆创建一个shell,bash
4.shell和bash的关系
bash时shell外壳的一种,shell外壳还有其他的一些种类,bash属于shell外壳这个集合
二.Linux中的用户权限
1.用户分类与身份切换
1.用户分类
Linux中的用户分为
1.root用户(超级管理员)
2.非root用户,也就是普通用户(xxx)
2.root用户切换为普通用户
1.su 用户名
我们现在是root用户,想要切换为普通用户wzs
执行su wzs即可
无需输入wzs用户的密码
切换后当前所处目录不变
2.su - 用户名
本质:退出root用户,以wzs用户的身份重新登陆,登陆后进入wzs用户的家目录
3.普通用户切换为root用户
1.su命令
我们当前是wzs用户,执行su命令并输入root用户的密码后切换为root用户
并且我们所处的目录不变
2.su-命令
我们当前是wzs用户,执行su -命令并输入root用户的密码后切换为root用户
所处目录更新为root用户的家目录
本质上来说就相当于退出当前用户并以root用户的身份重新登陆
4.普通用户想要切换成另一个普通用户
这些命令需要使用root用户的身份去执行
在这里我们补充一个命令:adduser 用户名:添加用户
passwd 用户名:设置该用户的密码
userdel -r 用户名:删除用户
我们在这里使用root的身份新添加了一个用户zs
并且设置了这个用户的密码
我们现在是wzs用户,想要切换为zs
我们这里以su命令为例,su zs,并且输入zs的密码才可以切换为zs
而另一种方法是:从wzs用户切换为root用户,然后再切换为zs,这个过程只需要root用户的密码,不需要zs的密码
可见root用户的密码非常强大,非常重要,那么什么样的人才会具有root密码呢?
一般是管理员
2.sudo命令
如果一个普通用户不想把自己变成root,但是还想让我自己以root的权限执行一条命令
sudo 想要执行的命令(对指定的指令进行提权)
那么这个时候就有一个问题了,
如果我们输入sudo就可以以root用户的身份执行指定的命令,那么root用户的密码不就毫无意义了吗?
答案是:不是的,因为sudo命令不是一般用户能够执行的
比方说我现在是zs,我先使用root用户的身份执行ls命令,那么我就
sudo ls
结果:被拒绝了
只有一个用户的用户名在sudoers file这个配置文件中,才允许这个用户执行sudo
否则,不允许他执行sudo命令
那么如何把某个用户的用户名添加进sudoers这个配置文件中呢?
在学完vim的时候我们会进行介绍
三.文件权限
在我们的日常生活中有各种各样的权限,所谓权限就一定是用来限制一部分人的操作的
例如:在CSDN上有一些文章只有vip才能看,leetcode上有些题是会员专属题只有会员才能做…等等等等
而且不同的应用程序或者网站场所等等都是只能提供一些特定的服务的
例如:
我们在爱奇艺当中就不能刷算法题,在leetcode中就不能看电影…等等等等
就算我们同时是爱奇艺和leetcode的会员,也无法做到这些事情
因为爱奇艺本来就无法刷算法题,leetcode本来就不能看电影
也就是说对于一些应用程序或者网站场所,它没有提供那个服务,就算我们权限是最高级别的,
也无法要求它去提供对应的服务
1.身份角色
我们前面提到过Linux中一切皆文件
那么对于某个文件来说有三种身份角色
1.文件的拥有者
2.文件的所属组
3.other
2.为什么要有所属组?
大家可能会想了,文件的拥有者和other我知道为什么要有,但是为什么要有所属组呢?
我们未来的项目开发都是团队合作的,我们的代码很有可能也是需要被团队内部所能够访问的,因此为了区分团队内部成员跟other,Linux创建了所属组这个身份角色
而对于一个文件来说最重要的就是这三个属性:
r:读属性
w:写属性
x:执行属性
我们只用wzs用户创建了一个新文件test.txt
-rw-rw-r-- 这个第一个-指的是test.txt这个文件不是目录文件 第2,3,4个分别是rw-:指的是文件拥有者对于这个文件拥有读,写权限,没有执行权限 第5,6,7个分别是rw-:指的是文件所属组对于这个文件拥有读,写权限,没有执行权限 第8,9,10个分别是r--:指的是other对于这个文件拥有读权限,没有写和执行权限 • 1 • 2 • 3 • 4 • 5
文件的详细属性(样例):
跟刚才举的现实生活中的例子相同的一点:
如果一个文件本来就没有执行的属性,就算你拥有这个文件执行的权限,你也执行不了这个文件,因为这个文件本来就不是一个可执行文件
所以Linux文件如果想要能够执行:
1.必须具有可执行权限x
2.它必须真的是一个可执行程序
3.如何更改权限?
1.chmod ugoa ± rwx file
u:user(文件的拥有者)
g:group(文件的所属组)
o:other
a:all(所有人)
+:添加对应权限
-:取消对应权限
rwx:读写执行权限
file:要修改权限的文件名
这里以test.txt为例:
例如我现在想要删除所有人的所有权限
例如我现在想要增加user的rwx权限
这时test.txt对于拥有者来说具有了执行权限,但是test.txt不是一个可执行程序
所以我./test.txt
去执行,没有任何反应
2.利用8进制设置文件权限
我们发现对于某个文件权限来说,这个文件权限一共有9个字符
对应到每个角色身上一共有3个字符,每个位置一共有两种状态,
一种是拥有这个权限,另一种是没有这个权限
如果我们用0来表示对应位置没有该权限,1来表示对应位置有该权限
所以我们可以用1个8进制数字来代表一个角色的权限,用3个8进制数字来代表整个文件的权限
例如:111:rwx权限都有
101:拥有r和x权限,没有w权限
所以我们可以这样去做
比方说我现在想设置test.txt的权限为:拥有者:rwx,所属组:r-x,other:—
对应到8进制表示为:750
4.root用户面前权限有作用吗?
没有作用
比方说我现在把test.txt的权限清空,转为root用户去添加内容,读取内容
丝毫没有任何约束
为了便于下面的操作,我新建了几个目录
5.chown和chgrp
那么我们来示范一下:
我现在想把这个文件给zs
但是给不了,为什么呢?
首先我们先明确一点:
那么怎么才能给他呢?
一般来说都是要用root去给,或者sudo指令提权
也就是这样:
使用root用户强制把这个文件给张三
那么能不能一起改呢?
答案是:可以的
6.own和grp一起改
比方说我想把这个文件的拥有者改成wzs,所属组改成zs
7. 匹配原则:
当一个人同时是文件的拥有者和所属组时,会先匹配他是拥有者,然后只看他作为拥有者的权限,不去看他作为所属组的权限
当我把文件的拥有者给root之后,我只是文件的所属组,那我就拥有了对于这个文件而言所属组的r权限了
四.文件类型
1.Linux中的文件类型
我们可以通过ll来查看Linux中的文件类型
我们先简单介绍一下链接文件和管道文件
1.链接文件
我们先创建一个test.c文件
然后我们gcc编译一下test.c文件,并且把生成的可执行程序a.out重命名为mycmd
然后把mycmd移动到dir/dir1/dir2/dir3的路径中
那么这个时候如果我想要在当前这个目录就能去执行mycmd,
那么我们只能
这样的话就不是很好,有点太麻烦了
这个时候链接文件就可以派上用场了
显而易见,这个链接文件就相当于我们在windows系统中创建的快捷方式
而且,在Linux中跟在windows系统中一样,删除快捷方式并不会影响到原来的可执行程序
在现在而言,我们就把它简单地理解为是快捷方式,这个链接文件我们以后还会遇到的
2.管道文件
管道文件跟我们之前介绍过的管道有非常紧密的联系,
我们可以先借助管道的作用来类比一下这个管道文件
如图,我们在第一个终端当中向管道文件mypipe中写入hello Linux.然后第一个终端就阻塞了.一直等到我们在另一个终端中接收这个hello Linux,
也就是说借助管道文件,我们就可以在两个终端之间进行信息交流了
管道文件和链接文件我们以后会详细介绍
2.Linux中的文件后缀名
Linux中的文件类型不通过后缀区分(但是:不代表Linux中后缀没有作用,后缀名还是有很大的作用的)
1.Linux中的文件类型是不通过后缀名区分的
首先,Linux中文件类型不通过后缀名区分,这个怎么理解?
首先我们用nano在test.c文件中写了一段C语言代码
无论我怎么修改这个可执行文件a.out的名字,我都是可以直接运行的
这也就说明了Linux下的文件类型是不通过后缀区分的
2.Linux中的后缀名的作用
1.Linux中的工具需要通过后缀名去区分文件类型
你不是刚才说过Linux中的文件类型是不通过后缀名区分的吗?
你现在怎么又说Linux中的工具需要通过后缀名去区分文件类型呢?
注意:Linux和Linux中的工具不是一回事
这里的Linux指的是Linux操作系统,
Linux操作系统跟Linux上面的工具,指令,编译器并不相同,也不包含
也就是说,这两句话没有任何冲突,矛盾的地方
下面给大家看一下演示:
我们把test.c重命名位test.txt,然后gcc编译,发现报错,无法编译
这也就说明了Linux中的工具需要通过后缀名去区分文件类型
2.Linux中的后缀名也是为了方便我们去进行操作
3.总结
3.file指令
file 文件名
file指令可以更加详细,直接地查看某一个文件的属性