一、shell命令以及运行原理
关于linux的定义:我们一般习惯上称Linux上的各种应用,命令行解释器,包括Linux内核都称作Linux,也就是宏观上的linux
但是Linux严格意义上说的是一个操作系统,也就是只包括linux内核,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel?
我们可以用这样一个图来简单的描述
如下所示,当我们进入Xshell的时候,里面的每一个的意思是这样的
而这四部分合起来我们称为bash命令行
输入指令的过程,本质就是在输入字符换
指令的本质就是就是编译好的程序和脚本,一定会在系统的特定目录下存放
我们所有的指令,最终都要在OS内部运行,但是OS使用难度比较高,我们用户不能直接和OS打交道。
所以有了图形化界面和命令行解释器
而前面所说的bash就是一种命令行解释器,命令行解释器就是shell
我们可以用一个故事来理解
如果说你是一个闷骚且害羞的程序员(就是我们的用户),那shell就像媒婆,操作系统内核就是你们村头漂亮的且有让你心动的MM小花。你看上了小花,但是有不好意思直接表白,那就让你你家人找媒婆帮你提亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给小花,而我们找到媒婆姓王,所以我们叫它王婆,它对应我们常使用的bash。
所以shell命令行解释器的作用如下
- 将使用者的命令翻译给核心(kernel)处理。
- 同时,将核心的处理结果翻译给使用者。
命令行解释器存在的意义就是
- 进行命令行解释
- 保护OS,对于用户的非法请求,直接拦截
关于这个命令行解释器
- 在linux中,就是命令行形式的,如bash,sh,shell
- 在windows中,一般就是图形化界面
shell是所有命令行解释器的统称,而bash,sh这些就是具体的命令行解释器
对比windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)。
shell对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运行出结果,通过shell解析给用户。
二、Linux下用户的分类
1.root用户和普通用户的切换
linux中用户一般分为两类
- root:超级用户(基本不受权限的约束)
- 普通用户:普通用户是受权限的约束的
- 超级用户:可以再linux系统下做任何事情,不受限制
普通用户:在linux下做有限的事情。
超级用户的命令提示符是“#”,普通用户的命令提示符是“$”
首先是这两个用户是如何切换的?
比如我们当前是一个普通用户
我们可以使用su指令,然后我们输入root的密码即可
这样切换以后,我们会发现,我们依旧处于原来的路径中,但是用户已经更改为了root账号了
现在当我们想要退出来的时候,我们可以直接使用exit或者CTRL + D快捷键,这样我们就可以退出root用户了
除了直接使用su,我们还可以加上-,也就是使用 su -指令
不过我们可以注意到,当我们输入密码以后,它是一种以登录的方式进入进去的,所以会显示登录的一些信息,并且它的登录后当前的目录直接切换为家目录
而像su就像是一个直接的身份转变。直接将一个普通用户变成root,但并不是以重新登录的身份变化的,而是把一个人硬变成了root
同样的,对于su -以后的root,我们直接退出的话,会显示logout
然后我们的目录切换回来原来的目录
如果我们当前已经是root用户了,但是我们想要登录一个普通用户,那么我们也可以su加上指定用户名即可,这里不需要密码。当我们想退出的时候直接exit或者CTRL+D即可
以上是root和普通用户之间的切换
下面是普通用户和普通用户之间的切换
我们可以直接su指定的普通用户即可,不过这里就需要输入普通用户的密码了
2.对一条指令的提权
当我们目前是普通用户的时候,我们知道,我们是不可以安装软件等操作的
因为安装软件其实就是将某些文件拷贝到系统的指定目录,而普通用户是没有权限进行拷贝的
所以我们可以使用sudo指令进行提权
sudo command
sudo后面加上你需要的操作,然后输入你的密码即可
不过在这里我们可能会觉得有些问题?那这样的话sudo只需要加上我当前账号的密码就可以了,那岂不是人人都是root,即便不知道root密码的情况下?
事实上却是是这样的
但是我们要注意:
我们当前adduser新建出来的用户,没有办法执行sudo,因为系统不信任我们,除非未来将普通用户,添加到系统的信任白名单里面
如下图所示,就是sudo无法提权的例子
三、什么叫做权限
1.权限
权限的最通俗的解释就是一件事情是否允许被我们做
- 权限认证的是身份(权限和“人”有关,这个人是有身份/角色的)
- 权限也和事物的“属性”有关(毕竟我们不可以将硬盘像面包一样啃一口)
这里的属性,我们指的就是文件属性。
文件属性有三种:可读可写可执行
2.文件的属性
我们可以先创建一个目录和一个普通文件,然后使用ll命令显示如下
我们可以看到有很多列,最后一列是文件名,然后紧接着的三列是时间。这些很容易看出来
可是前面五列又代表了什么呢?
3.文件类型
首先是第一列我们进行分析一下
第一列的第一个字符是代表着文件的类型
文件类型:Linux系统中文件名后缀没有直接的意义(当然不代表它不用)
也就是说,Linux系统不以文件后缀作为文件类型,而是以这个第一个字符代表文件类型
下面是第一个字符所代表的文件种类
- - :普通文件
- d : 目录文件
- b : 块设备文件
- c :字符设备文件
- p : 管道文件
- …
如下所示
我们可以看到,对于empty,它的第一个字符是d,所以它是一个目录文件,对于test.c,它的第一个字符是-,所以它是一个普通文件
其实一般而言,我们用的最多的就普通文件和目录这两种
其他的都是很少遇到的
b是块设备文件,其实就是磁盘文件,我们可以在这里看到,下面的这个文件就是b开头,也就是块设备文件
c是字符设备文件,通常有键盘、显示器文件等,如下所示的都是字符设备文件
p是管道文件,一般用于通信
如下所示,本来应该打印在左边的,但是却打印到右边去了
我们在上面说过Linux系统不以文件名后缀区分类型
所以我们可以去创建一个.c程序,然后编译后生成一个a.out文件,我们可以对这个文件随意的进行重命名。我们发现是可以运行的。这验证了我们前面所说的
可是当我们如果我们将这个.c程序的后缀改为了txt以后,gcc无法编译通过了
其实这里我们说的linux系统不以后缀辨认类型,但是gcc是一款编译器,软件,linux不认,但是gcc这个软件认
所以linux不认,但是不代表linux系统上运行的其他软件不需要认后缀
所以说:Linux中如何看待后缀,主要看用户需求
4.权限属性
如下所示,第一列的后九个字符代表的是权限的属性
其中
- r : 可读
- w : 可写
- x : 可执行
- - : 对应位置没有权限
这些权限是跟人有关系的
而我们将这些人划分为三种角色、权限身份
- 拥有者
- 所属组
- 其他人
那么现在问题来了,这三种角色权限身份和两种类型的用户有什么区别呢?
其实就是具体的用户可以有这些身份
即人+角色身份
对于我们下面的信息中,第三列就是拥有者
第四列就是所属组
而对于其他人,系统这直接使用排除法就可以了。不是拥有者也不是所属组那就是其他人
第五列是文件的大小
对于第二列,我们暂时先不讨论
所以现在我们在回过头来看第一列的后九个字符
他们三个三个为一组,分别对应拥有者,所属组和其他人的权限。
而且对于每一个权限里面,三个的位置分别依次代表,是否读,是否写,是否可执行
即
- 位置是什么含义是确定的
- 每个位置只有是或否,具有指定的权限
所以上面的test.c文件中
- 对于拥有者的权限是可读可写不可执行
- 对于所属组的权限是可读可写不可执行
- 对于其他人的权限是可读不可写不可执行
我们接下来使用三个用户来测试
如下所示,在拥有者的账户中,我们可以对其进行读也可进行写
当我们使用其他人的时候,和我们前面所想得一样,不可以写但可以读
但是当我们使用root的时候,虽然它是一个其他人,但是它居然可以读可以写
这说明root其实是不受权限约束的
我们继续做一个测试,我们先将这个test.txt的权限给全关了
我们可以发现,对于我们这个拥有者,没有了任何权限以后,我们无法读了也无法写了
对于其他人而言也是一样,没有了权限就无法读写了
但是我们继续看root,它这个老六居然啥都可以干
以上的例子再次证明了root不受权限的约束
当我们这个拥有者对它自己赋予了读权限的功能的时候,它就可以进行读取了
四、更改权限
一般而言,更改权限的人只有两种,一个是拥有者,一个是root
1. chmod 更改文件的属性
chmod指令可以进行权限的修改
比如下面的例子
如果对拥有者修改权限那么就是u
如果我们想要去掉某个权限,那么就是减号即可
我们也可以对所属组修改权限,用g来表示
如果我们相对其他人添加权限,用o来表示
我们也可以对多个身份多个权限同时操作
我们可以用逗号隔开分开操作
也可以使用a,a代表all,即对所有人去除掉某个权限
下面是删除掉全部人的全部权限
除了以上的指定修改,还有一种是利用比特位一一对应的方式来进行修改
所以我们可以用一个八进制数来代表权限