LinuxShell运行原理以及Linux权限
Linux——Shell运行原理以及Linux权限
1. Shell的运行原理
我们都知道Windows以图形化界面为交互方式,而Linux以命令行界面为交互方式。
图形化界面和命令行界面都是为了让用户进行相关操作,而图形化界面和命令行界面就是我们所说的“ 外壳程序 ”。
Linux严格意义上说是一个操作系统,我们称之为“核心(kernel)”,但我们一般用户不能直接使用kernel,而是通过kernel的“外壳程序”,也就是所谓的 Shell ,来与kernel沟通。
Shell最简单的定义就是“ 命令行解释器 ”:
1)将使用者的命令翻译给核心(kernel)处理。
2)将核心的处理结果翻译给使用者。
对比Windows中的图形化界面(GUI),我们操作Windows并不是直接操作Windows内核,而是通过图形接口,点击,从而完成我们的操作。
Shell对于Linux具有相同的作用,主要是对我们的指令进行解析, 解析指令给Linux内核,反馈结果再通过内核运行出结果 ,通过Shell解析给用户。
那么上面我们认识了Shell是什么,下面我们来谈它的运行原理。
Shell运行原理:
1)创建子进程,让子进程进行命令行解释。
2)子进程出现任何问题,都不影响父进程Shell。
这里我们简单理解,其实就是子进程与父进程是相互独立的,我们来Windows下启动一个程序,本质上是创建了一个子进程;比如我们打开微信,再打开QQ;如果此时微信程序终止了,或者我们退出了,QQ不会受到任何影响,这就是因为微信和QQ是两个独立的子进程,谁都不影响谁。
注意: Shell只是所有外壳程序的统称,例如在centos 7当中的外壳程序名叫bash。
2. Linux中的权限问题
2.1 Linux权限的概念
关于权限的概念,这里其实简单理解: ”权限“就是能或者不能做什么 。大家需要知道:
权限=角色+目标属性。
在Linux下有两种用户,分别是超级用户(root)和普通用户。超级用户可以在Linux下做任何事情,几乎不受限制,而普通用户一般只能在自己的工作目录下(/home/xxx)工作,以及在系统上做有限的工作。
换句话来说,所有的权限的概念都是用来限制普通用户的,而超级用户几乎不受限制。
超级用户的命令提示符是“#” 。
**root@hcss-ecs-348a:~# whoami
root**
普通用户的命令提示符是“$”。
**cp@hcss-ecs-348a:/root$ whoami
cp**
2.1.1 如何实现用户账号之间的切换
语法: su 用户名/su
功能: 用户切换。
从普通账号切换为root账号。
**cp@hcss-ecs-348a:/root$ su
Password:**
上面是我们从普通用户切换到超级用户的命令行操作,在Linux中密码是不回显的。
**root@hcss-ecs-348a:~# su cp
cp@hcss-ecs-348a:/root$**
上面是从超级用户切换到普通用户的命令行操作,超级切换普通是不需要输入密码的。
2.1.2 如何将普通用户添加到信任列表中
首先我们要切换到超级用户,然后使用vim打开文件sudoers进行添加(vim /etc/sudoers
)。打开后往下滑动,你会看见类似下面的命令行,这时按“i”切换到插入模式,将自己的普通用户名添加上去就OK了,我这里是ubuntu22.04系统下运行的。
**# User privilege specification
root ALL=(ALL:ALL) ALL
cp ALL=(ALL:ALL) ALL**
添加完成后,我们按“Esc”退出插入模式,再按“Shift+:”进入底行模式,你会在最后一行看见“:”,然后输入“wq!”保存退出即可。
2.1.3 如何仅提升当前指令的权限
但可能某些情况下,你只想提升当前指令的权限,那么不必切换到超级用户。
语法: sudo 指令
功能: 提升当前指令的权限。
例如,我现在要以一名普通用户的身份,修改另一个普通用户的账号密码。
**cp@hcss-ecs-348a:/root$ ls /home
cp xjy
cp@hcss-ecs-348a:/root$ whoami
cp
cp@hcss-ecs-348a:/root$ sudo passwd xjy
[sudo] password for cp:
New password:
Retype new password:
passwd: password updated successfully**
2.2 Linux权限管理
那么Linux中为什么要设计权限呢?其实就是为了限制用户的行为,防止错误的发生。
那么结合上面的内容,我们来理解一下权限是怎么来”限制“的,分两点:
首先,权限限制的角色(人);
其次,权限要求目标必须具有对应属性。
2.2.1 文件访问者的分类(人)
对于用户来说,权限可以将用户分为三大类:
1)文件和文件目录的所有者( 文件拥有者 )。
2)文件拥有者所在的组的用户( 文件所属组 )。
3)其他用户( other )。
注意:
1)对于某一文件而言,其拥有者、所属组和other就是由超级用户(root)和普通用户所扮演。
2)在Linux当中,所有用户都要隶属于某一个组,哪怕这个组只有你一个人(此时该组就以你的用户名为组名)。
这里我们可以通过“ll”命令来查看文件的拥有者和所属组。
那么大家思考一下为什么要由所属组这个概念呢?
其实这里也很好理解,如果我们没有所属组这个概念,那么当我们创建一个文件后,要么就是只有你自己(拥有者)能看到,要么就是其他人(other)也都能看到。而你所希望的是你自己和你的小组成员能看到,剩下的人看不到。
于是就有了所属组这个概念,这时你就可以将文件设置为拥有者和所属组可见,而other不可见。所以所属组的存在是为了更灵活的进行权限配置,满足团队协作。
注: 除了文件拥有者和文件所属组之外的都叫other。
2.2.2 文件类型和访问权限(事物属性)
在Linux中,一切皆文件。
那么根据上面的结论,权限要求的”目标“当然也是文件,那么要求其有对应属性,文件有哪些属性呢?
在Linux中,文件的属性就三种: 读、写、执行。
同样还是使用指令“ll”来查看文件属性
这串字符由10个字符组成的。其中第一个字符所代表的就是该文件的文件类型。
不同的字符代表不同的文件类型。
**1)-:代表普通文件。
2)d:代表目录。**
3)l:代表链接文件(类似于Windows当中的快捷方式)。
4)b:代表块设备文件(例如硬盘、光驱等)。
5)p:管道文件。
6)c:字符设备文件。
7)s:套接口文件。
注意: 在Linux当中,文件类型与文件后缀无关。
剩下的9个字符每三个为一组,分别代表该文件相对于其拥有者、所属组以及other是否拥有某种属性。
每一组的三个字符的第一个字符代表该文件是否具有可读属性,第二个代表是否具有可写属性,第三个代表是否具有可执行属性。
若是具有可读属性,则第一个位置的字符为r;若是具有可写属性,则第二个位置的字符为w;若是具有可执行属性,则第三个位置的字符为x。若某一位置为字符 - ,则说明不具有对应位置的属性。
下面我们举个例子,来描述一个文件的权限:
**-rw-rw-r– 1 cp cp 0 Mar 12 12:08 test4.txt
-rw-r–r– 1 root root 0 Mar 12 12:10 test5.txt**
对于test4.txt来说,test.txt是一个普通文件,该文件的拥有者和所属组对其都是可读可写的,但该文件的other对其只有读的权限。
对于test5.txt来说,test5.txt是一个普通文件,该文件的拥有者对其有读和写的权限;该文件的所属组和other都只对其有读的权限。
2.2.3 文件权限值的表示方法
2.2.3.1 字符表示法
ll指令打印文件权限值时的表示方法就是字符表示法。例如
2.2.3.2 八进制表示法
字符表示法中的每一个字符所在位置所表示的结果只有两种可能,要么为真,要么为假,因此我们可以将这三个字符换为三个二进制位,进而换为一个八进制位进行表示。例如
2.2.4 文件访问权限的相关设置方法
2.2.4.1 chmod指令权限值
语法: chmod 选项 权限 文件名或目录名
功能: 设置文件的访问权限。
格式一: 用户符号 +/-/= 权限字符
1)+:向权限范围增加权限代号所表示的权限。
2)-:向权限范围取消权限代号所表示的权限。
3)=:向权限范围赋予权限代号所表示的权限。
用户符号:
1)u:拥有者。
2)g:所属组。
3)o:other。
4)a:所有用户。
修改前:
-rw-rw-r– 1 cp cp 0 Mar 12 12:08 test4.txt
cp@hcss-ecs-348a:~$ chmod o+wx test4.txt(指令修改)
修改后:
-rw-rw-rwx 1 cp cp 0 Mar 12 12:08 test4.txt*
若要同时设置不同类用户的访问权限,则需用逗号隔开。
修改前:
-rw-rw-rwx 1 cp cp 0 Mar 12 12:08 test4.txt*
cp@hcss-ecs-348a:~$ chmod o-wx,u+x test4.txt(指令修改)
修改后:
-rwxrw-r– 1 cp cp 0 Mar 12 12:08 test4.txt*
格式二: 三位八进制数字
将对应的八进制数转换为二进制,进而设置对应权限值。
修改前:
-rwxrw-r– 1 cp cp 0 Mar 12 12:08 test4.txt*
cp@hcss-ecs-348a:~$ chmod 667 test4.txt(指令修改)
这里的667是八进制数字,换成二进制就是110110100,就代表rw-rw-rwx。
修改后:
-rw-rw-rwx 1 cp cp 0 Mar 12 12:08 test4.txt*
2.2.4.2 改变文件的拥有者
语法: chown 选项 用户名 文件名或目录名
功能: 修改文件的拥有者。
修改前:
-rw-rw-rwx 1 cp cp 0 Mar 12 12:08 test4.txt*
**修改指令:cp@hcss-ecs-348a:~$ sudo chown root test4.txt
[sudo] password for cp:**
修改后:
-rw-rw-rwx 1 root cp 0 Mar 12 12:08 test4.txt*
这里大家会发现这个文件的拥有者被改成了root。
注意: 修改文件的拥有者需要root用户进行操作,若是普通用户则需要进行权限提升。
也可以 使用chown指令同时修改文件的拥有者和所属组 ,将拥有者和所属组的用户名用冒号隔开即可。
修改前:
-rw-rw-rwx 1 cp cp 0 Mar 12 12:08 test4.txt*
修改指令:cp@hcss-ecs-348a:~$ sudo chown root:root test4.txt
修改后:
-rw-rw-rwx 1 root root 0 Mar 12 12:08 test4.txt*
2.2.4.3 修改文件的所属组
语法: chgrp 选项 用户名 文件名或目录名
功能: 修改文件的所属组。
修改前:
-rw-rw-rwx 1 root root 0 Mar 12 12:08 test4.txt*
修改指令:cp@hcss-ecs-348a:~$ sudo chgrp cp test4.txt
修改后:
-rw-rw-rwx 1 root cp 0 Mar 12 12:08 test4.txt*
2.2.4.4 修改文件的权限掩码
这里大家需要思考一个问题,为什么新建的文件和目录都有默认的权限?
drwxrwxr-x 2 cp cp 4096 Mar 12 12:02 mytest/
-rw-rw-r– 1 cp cp 0 Mar 12 18:06 test6.txt
这里我们看到的权限是最终权限,而
最终权限=默认权限&(~umask)
在Linux中, 新建文件的默认权限为666,新建目录的默认权限为777;
这里提到的umask是系统内默认存在的一个叫作 权限掩码 的概念:
我们可以通过指令来查看我们系统权限掩码:
语法: umask 权限值
功能: 查看或修改文件掩码。
**cp@hcss-ecs-348a:~$ umask
0002**
这里我的系统的权限掩码就是0002。
那么权限掩码的目的是什么呢?
其实通过上面的图,大家可以发现其目的就在于 希望权限掩码中出现的权限不在最终权限中出现。
那为什么要设计权限掩码呢?
第一点在于,最终权限由操作系统自主决定,无法在创建前进行修改——系统可配置、可灵活满足需要的一种表现。
第二点在于,特殊情况下,我们可以通过配置umask来控制文件的最终权限,让代码实现可控。
有了上面的铺垫,想必大家也可以想到,我们可以通过改变权限掩码来设置文件的访问权限:
cp@hcss-ecs-348a:~$ umask 000
cp@hcss-ecs-348a:~$ touch data.txt
-rw-rw-rw- 1 cp cp 0 Mar 12 18:26 data.txt
大家可以看到,data.txt文件的最终权限是受到权限掩码的影响的。
**cp@hcss-ecs-348a:~$ umask 777
cp@hcss-ecs-348a:~$ mkdir file**
d——— 2 cp cp 4096 Mar 12 18:28 file/
这里同上,我们创建的新目录file的
最终权限是受到权限掩码的影响的。
注意: 超级用户的默认掩码为0022,普通用户的默认掩码为0002。
2.2.5 目录的权限
对于文件来说,其可读可写可执行的属性我们都知道分别代表着什么对应的操作,那对于目录来说可读可写可执行又分别代表着什么呢?
1)可读权限: 如果用户没有该目录的可读权限,则无法通过ls指令查看目录中的文件内容。
2)可写权限: 如果用户没有该目录的可写权限,则无法通过一系列指令在目录中创建文件或删除文件。
3)可执行权限: 如果用户没有该目录的可执行权限,则无法通过cd指令进入到目录当中。
那么这就会出现一个问题:
只要用户拥有某目录的可写权限,就可以删除该目录当中的文件,而不论该用户是否拥有该文件的可写权限,这显然是不合理的。
drwxr-xrwx 2 root root 4096 Mar 12 12:14 dir/
**cp@hcss-ecs-348a:~$ cd dir
cp@hcss-ecs-348a:~/dir$ touch test7.txt
cp@hcss-ecs-348a:~/dir$ ll
total 8
drwxr-xrwx 2 root root 4096 Mar 12 18:42 ./
drwxr-x— 5 cp cp 4096 Mar 12 18:28 ../**
-r–r–r– 1 cp cp 0 Mar 12 18:48 test7.txt(这里经过处理,让我们对其没有“写”权限)
**cp@hcss-ecs-348a:~/dir$ rm -f test7.txt
cp@hcss-ecs-348a:~/dir$ ll
total 8
drwxr-xrwx 2 root root 4096 Mar 12 18:43 ./
drwxr-x— 5 cp cp 4096 Mar 12 18:28 ../**
大家发现,我们对dir目录来说是other,我们拥有对其写的权限,那么我在dir目录下创建一个新文件test7.txt,此时大家注意这个文件没有写权限,但是我们还是能将它删除,所以这个现象就比较奇怪了,我不能“写”这个文件,但是却可以直接删除它,为了解决这个不合理的问题,Linux引入了 粘滞位 的概念。
2.2.6 粘滞位
语法: chmod +t 目录名
功能: 给目录加上粘滞位。
当一个用户将某一个目录加上粘滞位后,该目录的权限值的最后一位变为字符“t”。
修改前:
drwxr-xrwx 2 root root 4096 Mar 12 18:56 dir/
修改指令:root@hcss-ecs-348a:/home/cp# chmod +t dir
修改后:
drwxr-xrwt 2 root root 4096 Mar 12 18:56 dir/
此时我们再次来删除文件,大家会看到下面的报错:
**cp@hcss-ecs-348a:~/dir$ rm -f test7.txt
rm: cannot remove ’test7.txt’: Operation not permitted**
这里就是粘滞位起到作用了,我们无法像上面那样去删除文件test7.txt了。
总结:
当一个目录被设置为粘滞位,则该目录下的文件只能由:
1)超级用户删除。
2)该目录的拥有者删除。
3)该文件的拥有者删除。