欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > Linux——Shell运行原理以及Linux权限

Linux——Shell运行原理以及Linux权限

2025/3/13 14:41:12 来源:https://blog.csdn.net/2302_81486993/article/details/146192140  浏览:    关键词:Linux——Shell运行原理以及Linux权限

目录

1. Shell的运行原理

2. Linux中的权限问题

2.1 Linux权限的概念

2.1.1 如何实现用户账号之间的切换

2.1.2 如何将普通用户添加到信任列表中

2.1.3 如何仅提升当前指令的权限

2.2 Linux权限管理 

2.2.1 文件访问者的分类(人)

2.2.2 文件类型和访问权限(事物属性)

2.2.3 文件权限值的表示方法

2.2.3.1 字符表示法

2.2.3.2 八进制表示法 

2.2.4 文件访问权限的相关设置方法 

2.2.4.1 chmod指令权限值

2.2.4.2 改变文件的拥有者

2.2.4.3 修改文件的所属组

2.2.4.4 修改文件的权限掩码

2.2.5 目录的权限

2.2.6 粘滞位


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)该文件的拥有者删除。


 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词