Linux:shell命令运行原理和权限的概念

简介: Linux:shell命令运行原理和权限的概念

shell和kernel

从狭义上来讲,Linux是一个操作系统,我们叫它叫kernel,意思是核心,核心的意思顾名思义,就是最关键的部分,而作为普通用户实际上是不可以使用kernel的,会借助一个外壳,这个外壳就是shell,简单来说,shell就是一层保护在kernel外面的保护层,一层外壳,那么为什么呢?为什么不能命令kernel?为什么要在外面加一层shell?这就需要更加深入理解shell了

shell的概念和原理

从技术角度来讲,shell其实就是一个翻译官,它负责把用户输入的指令输给核心,让核心进行处理,再把kernel处理的结果传递给用户,是一个中间人的作用

其实,Windows中也有类似的存在,这个东西叫做GUI:GUI是一个图形化接口,它也是起到了沟通用户和操作系统的作用,假设现在要访问一个文件夹,我们的操作通常是点击一下这个文件夹,而GUI就负责把这个命令传递给操作系统,操作系统接收到这个命令后就再传递回用户,告诉用户成功进入了

而shell对Linux来说就和这个一样,假如用户说我要

cat test.txt

那么这个shell外壳就把这个命令传递给kernel,kernel就做出回应,shell外壳再传给用户

上面所示的就是shell的作用实例

补充:

在实际应用中,shell也并非直接参与,而是创建一个一个的子进程,让子进程执行命令,而作为父进程的shell则继续进行命令行接受,防止有意外情况的发生导致外壳shell无法正常工作,后续在进程的篇章中会有更多解释

Linux的权限

Linux的权限是Linux的一大特色,理解好Linux的权限对于后面的学习是有很大意义的

首先,从大的方向上划分,Linux的用户主要有两种,root和普通用户

超级用户:可以做任何事情,只要有指令实现都可以

普通用户:局限性比较强,完成一些基本的操作

这里需要补充两个命令:

命令1:su 用户名

功能:用来切换用户

命令2:sudo root

功能:临时用root账号执行命令,sudo可以短时间内提升权力,但前提是要在sudo的名单内,否则也无法达成目的:

注意这里有一个细节,只需要用到free的密码,也就是说,不需要用root的密码也可以做到权限提升,那么这是为什么?

原因在于这样可以防止root账号的密码被滥用,实际上也是一种安全,root账号可以操控是否能使一个用户拥有root权力与否

文件的权限

Linux的权限往往是伴生于文件的,对于文件来说,权限是极其重要的,下面来进行权限和文件的理解

首先,对于一份文件,常常有下面的两类属性:

第一个是人属性,即该文件是谁写的,谁有权力看,在Linux中把人的属性分为三种,分别为拥有者,所属者和其他人

第二个是事物属性,即这份文件可以被什么人用什么方式访问,在Linux中把文件的属性分为三种,分别为可读,可写和可执行,分别对应的是rwx

文件的类型

在我们Windows中的使用中,假设我们要写一份C语言代码,我们会命名为test.c,如果要写一份文本文件,我们会写test.txt,这是因为在Windows中,一份文件的类型来源于它的后缀,后缀是什么样子的决定了这是一个什么样的文件,但在Linux中却并不是这样

在Linux中,文件的类型并不取决于后缀,而是取决于目录中的第一个字符,假设这里我们创建了一个文件test

而这里开头的 - 其实就代表了这到底是什么样子的文件

在Linux中有下面这些文件类型:

d:文件夹

-:普通文件

l:软链接(类似Windows的快捷方式)

b:块设备文件(例如硬盘、光驱等)

p:管道文件

c:字符设备文件(例如屏幕等串口设备)

s:套接口文件

需要注意的是,Linux中的后缀的意义是给人看的,但如果是gcc编译器,也会对后缀做出一定的区分,但整体看Linux中并不太关心文件的后缀是什么形式

文件的权限管理

因此,这次就能观察它的前缀都代表什么意义

下面我们来一一看这些内容到底是什么意思

这里需要注意的是,第二列到第十列都属于的是拥有者,所属组,其他人的权限,而这些权限并不会因为没有就不显示,而是会以- 的形式存在,因此会出现rw- — r–等形式的存在

下面有一些对上图所示的知识的补充:

1. 用户和角色的联系?

用户和角色并没有太多的联系,一个普通用户在一个文件中是所属用户,也可能是所属用户组,root用户也可以既不是所属用户,也不是所属用户组

2. 所属组是什么?

所属组在开发项目的过程中有它的作用,一个组可以只有一个人,也可以有很多人,这些人都是该项目组的成员

3. 所属组有什么用?

简单来说,所属组就是用来给所属用户和其他人之间创建一个有部分权限的人,假设我有一份工程,我正在完善它的过程中,而此时有其他人要来看我的工作进度,我想给他开放阅读的权限,但并不想给其他人看,因此就可以让他进入我的所属组,并给他阅读的权限,这样就既达到了让他阅读的权限,又能让别人无法看到,我作为文件的所属者可以随时进行权力的增加,修改和删除,这也是Linux系统提高工作效率的表现之一

更改权限的指令

指令:chmod

功能:设置文件的访问权限

格式:chmod [参数] 权限 文件名

常用选项:

R -> 递归修改目录文件的权限

说明:只有文件的拥有者和root才可以改变文件的权限

+:向权限范围增加权限代号所表示的权限

-:向权限范围取消权限代号所表示的权限

=:向权限范围赋予权限代号所表示的权限

用户符号:

u:拥有者

g:拥有者同组用

o:其它用户

a:所有用户

权限的实战应用

在知道了权限的作用后,下面就进行对权限的更改方式和具体实践结果

首先,要创建这样的场景:

那么下面那么此时,test对于free的文件夹来说就是other的身份,现在创建一个test文件

根据上面所学的知道这里test文件对于拥有者来说有可读和可写的权力,对于所属组来说有可读和可写的权力,对于其他人来说有可读的权力,那么我们添加一下对于其他人访问该文件有写入的权限

chmod o+w test

这里修改权限的方式不止此一种,还可以采用八进制的方式,原理如下

首先这里创建了一份文件,而这个文件有三组权限,分别是拥有者,所属组和其它人,假如我们把有权限看成1,没有权限看成0,那么每一组的值的范围是从0到7,因此可以采用八进制用以表示权限,具体实现如下

于是在test用户下,他也可以用echo进行修改test中的内容

echo "hello" >> test

此时我不想让test用户再看到和写入我的文档了,我就可以对文档的other用户进行权限删减

此时如果test用户再继续访问,就会提示权限不足

默认权限

那什么是默认权限?

从中可以看出,创建好的文件其实并不相同

对于文件夹来说,它的权限是rwxrwxr-x,翻译成八进制数字就是775

对于文件来说,它的权限是rw-rw-r–,翻译成八进制数字是664

那为什么会这样?这里就提到了默认权限的问题

Linux中规定,对于文件来说,权限默认的大小是666,对于目录来说,默认的权限大小是777

那既然这样,为什么实际产生出的权限是775和664?

这里就又引入了权限掩码的概念

权限掩码

在Linux中,和权限掩码相关的指令是umask

那umask是什么?权限掩码又是什么?

首先介绍权限掩码诞生的原因:

Linux中由于一些原因(后续进行补充),对于使用者创建出的文件有默认的权限大小,但面向众多用户,不免有些需求在创建的时候实际上需要的不仅仅是这些默认的需求,需要一些定制化的需求,因此便产生了权限掩码的概念

权限掩码简单来说,就是在Linux本身已经诞生的默认权限的基础上,对一些权限进行去除,如何查看权限掩码?指令就是

umask

从上图中可以看出得出的结论是0002,实际上权限掩码是后三位,也就是002,因此这里把权限掩码进行一定程度的翻译,得出的就是这样:

--------w-

因此就解释了为什么默认权限是666或777,但实际上是664和775,就是因为在创建的过程中由于权限掩码的存在,权限掩码摘除了对于其他人而言,它们的写的权限被摘除了

权限掩码也是可以被修改的:

这里改成了0007,就意味着如果我创建一个对象,不管是文件还是目录,对于其他人而言的权限部分都是空的,来印证上面的猜想:

这里也证明了权限掩码的概念

那问题又来了

为什么要引入权限掩码?

在解释这个问题之前,我们先知道想要访问一个文件夹需要什么权限

目录的权限

前面我们说到了,不管是文件还是目录都有rwx这三种权限,对于文件来说,r是阅读的权限,w是写入的权限,x是可执行的权限,这个很好理解

那对于文件夹来说,rwx又是什么意思呢?

可读权限: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容

可写权限: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件.

可执行权限: 如果目录没有可执行权限, 则无法cd到目录中.

因此,如果对于一个other,假设它现在进入了我个人的私人目录下,我目录下的目录如果没有开启x的权限它是不可以进入的

那么下一个问题是,如果我想删除一个文件,需要什么权限?

你可能会想,需要的是文件的某个权限吧,其实不然,想要删除某个文件,需要的是文件所在目录的写权限,因此可能会出现这样的场景:

这个场景很有意思,我虽然不能读取你的文件,但是我可以把你的文件删掉,这里就会很有疑问,为什么要这么设计?

这是因为文件的删除或新增权限是由文件所在目录决定的,文件所在的目录如果开放了w权限,那么任何人都可以进行目录内的增加或删除内容

为了解决这个问题,Linux中引入了粘滞位的概念

粘滞位

这里需要注意的是:

当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由

一、超级管理员删除

二、该目录的所有者删除

三、该文件的所有者删除

相关文章
|
9月前
|
算法 Linux Shell
Linux实用技能:打包压缩、热键、Shell与权限管理
本文详解Linux打包压缩技巧、常用命令与原理,涵盖.zip与.tgz格式操作、跨系统传文件方法、Shell运行机制及权限管理,助你高效使用Linux系统。
Linux实用技能:打包压缩、热键、Shell与权限管理
|
9月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
839 9
|
9月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
865 2
|
11月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
1244 1
|
NoSQL Linux 编译器
GDB符号表概念和在Linux下获取符号表的方法
通过掌握这些关于GDB符号表的知识,你可以更好地管理和理解你的程序,希望这些知识可以帮助你更有效地进行调试工作。
566 16
|
Unix Linux
对于Linux的进程概念以及进程状态的理解和解析
现在,我们已经了解了Linux进程的基础知识和进程状态的理解了。这就像我们理解了城市中行人的行走和行为模式!希望这个形象的例子能帮助我们更好地理解这个重要的概念,并在实际应用中发挥作用。
269 20
|
Linux Shell
shell_42:Linux参数移动
总的来说,参数移动是Linux shell脚本中的一个重要概念,掌握它可以帮助我们更好地处理和管理脚本中的参数。希望这个解释能帮助你理解和使用参数移动。
334 18
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
399 4
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
664 3
|
存储 Linux Shell
Linux进程概念-详细版(二)
在Linux进程概念-详细版(一)中我们解释了什么是进程,以及进程的各种状态,已经对进程有了一定的认识,那么这篇文章将会继续补全上篇文章剩余没有说到的,进程优先级,环境变量,程序地址空间,进程地址空间,以及调度队列。
242 0