Linux《权限》

在上一篇章的Lunix《基础指令》当中我们已经初步了解了Linux中的基本指令,并且在学习指令的过程中还学习了许多的Linux的基础知识,那么在本篇中将了解Linux内权限相关的知识,会学习Linux内权限的基本概念,之后还会了解如何修改文件的权限信息等操作;最后还要来了解关于权限的三个重要问题。接下来就开始本篇的学习吧!!!


1.Shell命令以及运行原理

在学习权限的相关知识之前我们先来了解Shell的运行原理

Linux严格意义上说的是⼀个操作系统,我们称之为**"核心(kernel)** " ,但我们一般用户,不能直接使用kernel。而是通过kernel的**"外壳"** 程序,也就是所谓的shell ,来与kernel沟通。如何理解?为什么不能直接使用kernel?
从技术角度,Shell的最简单定义:命令行解释器(command Interpreter)主要包含:
• 将使用者的命令翻译给核心(kernel)处理。
• 同时,将核心的处理结果翻译给使用者。

在此使用图示操作系统的内核与shell的关系如下所示:

在此通过以上的描述也是能粗略的了解什么是Shell外壳程序,接下来就通过一个生活当中的示例来感性的理解内核、Shell以及用户之间的关系,而具体的理性认识要等到之后在进程当中的操作系统时再进行

假设你是小李,是一个刚从大学毕业的学生,因为你在大学这四年里很刻苦的学习计算机的知识,之后如愿的得到了大公司的offer,在过年的时候你回到了家里,这时你的父亲村长老李就对你说:"小李啊,你看你如今也进到大公司里了,是不是要考虑一下是时候找一个女朋友了呢?",听到了这你就对老李说"爸,你这道的我就不擅长和女孩子打交道的,如果说如果让我写一个项目对我来说是很简单的2,但是啊要找女朋友这可就难到我了",老李听到这就说:"你不擅长没事啊!在我们村不是有一个媒婆王婆啊,让她帮你说媒不就行了,明天我就把王婆请来"

过了一天王婆就来到了你的家里,王婆就对你说:"小李啊,你看上了我们村的那个女孩子直接和我说,有我的说媒随便成",听到这你就说:"我从小到大就对街不远处的小花十分的喜欢,但是我又不好意思和她说话",王婆听到了你的诉求改天就来到了小花家,对小花说:"小花啊,这街不远处的小李对你很有好感啊,你看他爸是村长,他自己还进到了大公司了,你要不和他处处看?",小花听到这就说:"小李我看他呆呆的,不是我喜欢的类型还是算了吧",王婆听到第二天就把这就把小花的回答传送给了你。

在以上的故事当中其实你就是用户,小花就是操作系统内核,而王婆就是Shell外壳,Shell外壳程序就是把你的诉求也就是命令转达给了内核小花,并且还把内核执行命令的结果反馈给了你

在此王婆存在的意义就是执行你不擅长的,Shell作用也是类似也是由于用户无法自己将命令传给操作系统这就需要Shell外壳程序来作为一个传输者

但是你得到了王婆了反馈之后,十分的伤心,这时王婆就对你说:"这小花不适合你,王婆来给你介绍几个更好的",这时你就说:"我不要,我就只喜欢小花,除了小花谁也不行",这时老李说:"你这孩子,那没办法,王婆就只好请你再去小花那说一次了",王婆听完之后只好再次前往小花家。可是这次当王婆走到小花家的门口就看到了小花和她的男朋友在和她的父母吃饭,这时王婆就心想:这我可不能再去小花家帮小李说媒了,这小花原来都有男朋友了,我再去指定会直接被赶出来,这事传出去我王婆的招牌不就坏了。之后王婆就头也不回到的离开了小花家,之后直接来到李家将小花已经名有其主告诉了你。

在以上的续集当中王婆对你对小花已经有女朋友还去访问的这个要求,王婆作为外壳程序直接就拒绝了访问,不再将用户的命令传输给系统内核,这样是为了保护操作系统的安全。因此在用户要进行的命令是非法请求时就会直接在外壳程序这层解决拒绝访问。

接下来王婆将小花已经有男朋友的消息告诉了你,但是你还是无法接受,和王婆说还有机会,之后再让王婆帮你说说,王婆这时很无语,但是又不能直接拒绝你的请求。那么王婆这时就在想有什么两全其美的解决办法呢?不久之后王婆就想到了一个绝妙的方法,那就是找一群实习生来完成说媒的工作,实习生成功了也是顶着王婆的名号;只要说媒成功,那么名声也是到王婆的头上,而且如果出现一直说媒都无法成功,那么王婆就可以说是实习生的问题,只要给客户换一个实习生即可

以上王婆通过招聘实习生来运行的模式其实就是在Shell当中会通过创建子进程的方式来进行命令行的解析

注:以上提到的故事当中Shell就是媒婆,而王婆就是具体的媒婆,在不同的操作系统当中Shell外壳程序也不同,在Linux当中就是Bash

2.Linux权限

在以上我们初步了解了Shell之后接下来就来了解Linux当中非常重要的权限问题,在此会了解什么是权限、文件的权限、权限的修改已经三个关于权限的问题

2.1 什么是权限

首先来了解什么是权限。例如当我们要进入一个小区就需要是这个小区内的业主,这就是权限的体现。因此权限就是影响着我们能不能做一件事

以下是两点需要对权限有的认识:

1.权限是限制人的
2.目标事物的属性也会影响权限

由于人=真实的人+身份角色,因此权限就可以等价于****角色+事物的属性

2.2 认识人

在以上我们了解了权限是由什么组成的,那么接下来就来了解在Linux当中人代表什么

在Linux当中人就是用户,分为两种,分别是普通用户和超级用户(root)

超级用户(root):几乎不受任何的限制
普通用户:Linux使用者,受权限的约束

在Linux当中如果要进行普通用户和root之间的切换就需要用到su指令

cpp 复制代码
su [用户名]

要将用户进行切换就需要使用su指令,如果是要将普通用户切换成为root就只需要输入su

在使用su指令时密码是不回显的

如果是将root切换到普通用户或者是两个普通用户之间的切换就需要在su之后带上用户名,并且在普通用户切换到另一个普通用户时候就需要输入另一个用户的密码

如果要快速的返回到上一个用户就需要使用su - 指

cpp 复制代码
su -

在使用su进行用户的切换时,使用pwd可以看到切换过程当中用户所处的家目录是不会改变的

如果要将家目录也进行相应的调整就需要使用 cd ~ ,这样就能实现默认路径的切换

cpp 复制代码
cd ~

在普通用户当中使用ls、touch等的指令时就会命令行就会显示出以下的信息

出现以上问题的本质其实是当前所在的普通用户不在配置文件的白名单当中,也就无法使用相关的命令,但是将用户写到配置文件当中是需要使用到编辑器vim的,当时当前我们还没学习到vim,也就不会使用vim内的相关操作来进行配置文件的修改,因此就将该工作留到了解vim的使用之后。

注:以下进行的操作我也将普通用户写到系统当中的白名单当中,也就不会出现以上的问题

2.3 文件属性

在之前我们了解过在Linux当中以在ll当中以d开头的是目录;以-开头的是普通文件,之前也说过在Linux当中其实还存在其他类型的文件,那么接下来我们就来了解看看

在Linux当中其实除了以上类型的文件其实还有以下的文件类型:

c:字符设备文件(例如:显示器、键盘)
b:设备块文件(例如:磁盘)
p:管道文件
I:链接文件

了解完以上的文件类型之后接下来继续来了解在ll指令当中如下所示的部分表示的是什么

首先我们知道人=真实的人+身份角色,真实的人就是指Linux各个用户,在此在文件当中各个用户就扮演着不同的角色,不同的角色在文件同一个文件当中就有着不同的权限

在Linux当中角色就分为三种:

1.文件拥有者
2.文件所属组
3.other

了解了角色的划分接下来来了解对于文件的权限有哪些

在此一共有三种r、w、x分别表示可读、可写、可执行。

并且在文件当中权限的表示一定以rwx的方式排列,当没有对应的权限时就以 - 替代,

例如 -rx表示没有可读的权限、r-x表示没有可写的权限、---表示没有任何的权限

在使用ll指令时能明确的表示出拥有者、所属组以及other的权限,具体如下所示:

我们还要了解到r代表可读,也就是表示只要用户有r权限就可以查看文件的内容;而w表示可写,也就是表示用户有w权限就可以修改文件的内容;而x表示可执行,也就是表示用户有x权限就可以执行文件。

注:在Linux当中一个文件要能执行除了用户有对应的x权限之外还w要求对应的文件真的能执行,这两个缺一不可,只有两个都满足才能将对应的文件执行。

以上使用ll指令时除了以上的信息之外其他的表示以下的意义:

在一个文件当中可能会出现一个用户即是拥有着又存在所属组当中,那么要是两个角色的权限不一样,那么该用户的权限应该遵从哪个呢?

在此我们要记住的是用户在进行文件身份的比对时是从左往右的并且只进行一次的比对。
在以上的示例当中当用户即是拥有着又存在所属组当中就只会以拥有着的权限来执行

2.4 修改文件权限

修改文件权限可以分为修改文件的角色和修改文件角色的权限

在此先来了解修改文件的角色

1.要修改文件的拥有者就需要使用到chown指令,具体的使用形式如下所示:

cpp 复制代码
chown [用户] [文件]

但是在以上示例的使用chown修改文件的拥有着为什么无法执行呢?

其实是因为在Linux当中要修改文件的拥有着必须是root或者使用指令提权

root我们知道是什么,但是指令提权又是什么呢?
其实在此指令提权其实就是在一些情况下普通用户的是无法实现一些操作的,这时就需要借助root的能力来实现,此时就需要使用到sudo指令

cpp 复制代码
sudo

只需要在原本要执行的指令之前加上sudo就可以实现

注:普通用户要能使用sudo的前提是被操作系统信任,必须要在系统的白名单当中,也就是要是对应的用户被写道配置文件当中才能使用指令提权

使用了sudo之后以下的指令就可以执行

要修改文件的所属组就需要使用到chgrp

cpp 复制代码
chgrp [用户] [文件名]

注:在以上修改文件的拥有着或者是所属组时使用sudo之后都是要输入进行操作用户的密码的

接下来来了解修改文件的角色的权限

要修改文件角色的权限就需要使用chmod指令

cpp 复制代码
chmod [权限] [文件名]

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

chmod命令权限值的格式:
• 用户表示符+/-=权限字符
◦ +:向权限范围增加权限代号所表示的权限
◦ -:向权限范围取消权限代号所表示的权限
◦ =:向权限范围赋予权限代号所表示的权限
◦ 用户符号:
◦ u:拥有者
◦ g:拥有者同组⽤
◦ o:其它用户
◦ a:所有用户

在此要注意的是对于一个文件,如果没有r权限,那么使用任何的工具都无法获取文件的内容,这是因为权限限制的是人

例如以下示例:

将文件test2.cother的权限修改为---,之后向该文件当中使用echo输入字符串"hello world",再决赛将用户切换至xxy

之后使用cat就会发现无法获取test2.c内的文件内容

使用nano文本编辑器也不行

其实在修改文件用户的权限除了可以使用用户表示符+/-=权限字符 的方式之外还可以使用三位8进制数字的方式修改,由于rwx三位有权限就表示为1,否则就为0,那么rwx就可以表示为111,转换为8进制就是7,而---就表示为000,转换位8进制就是0。因此用户的权限范围就是0~7,这就可以是使用chmod+3个八进制数字来进行权限的修改。例如要将文件修改为所有用户都有全部的权限,那么就使用chmod 777

2.5 三个权限的问题

在以上我们对权限有了基本的认识,那么接下来就来进一步了解在权限当中的三个重要问题

1.目录权限

在以上我们在学习修改文件权限时都是在普通文件当中,那么目录和普通文件和目录在权限上有什么区别吗?

在Linux的目录当中要进入一个目录需要有x权限

例如以下将目录dir1拥有者的x权限去了,那么接下来使用cd命令就无法进入dir1目录内

在Linux当中要查看目录的文件属性需要有r权限

例如以下将目录dir1拥有者的r权限去了,那么接下来使用cd命令进入dir1之后使用ls等命令无法看看文件的属性

在Linux当中要需要有w权限才能在目录当中进行文件的新建、删除和修改

例如以下示例,将目录dir1的拥有者w权限去掉,之后在目录内进行文件或者目录的创建就无法执行

2.缺省权限

在此创建一个目录和一个文件就可以看出默认的权限创建的默认权限分别是775和664

在此umask表示的权限掩码,要查询当前的权限掩码就是使用umask命令

复制代码
umask

通过使用umask命令就可以发现umask默认的值是0002

在此Linux当中普通文件的起始权限是666 ,目录的起始权限是777。那么此时你可能就会好奇了缺省权限是怎么由起始权限化到缺省权限的呢?

其实缺省权限默认是由起始权限&~umask

在umask当中左边的第一个0我们不关注,之后的002转化为二进制表示之后就得到了000 000 010,在将其进行按位取反得到111 111 101 若是目录就再将结果和起始权限777,二进制表示111 111 111进行按位与运算,得到的结果就是111 111 101,结果就是775;若是文件就再将结果和起始权限666,二进制表示110 110 110进行按位与运算,得到的结果就是110 110 100,结果就是664

因此要修改文件的缺省权限就可以使用如下的命令

cpp 复制代码
umask 权限值

3.粘滞位

我们知道在Linux当中不同的用户之间是隔离的,其他的用户是无法访问你的用户的家目录的

那么要实现两个用户之间的通信就不能将进行通信的文件创建在普通用户的家目录下,此时我们创建一个通信文件在根目录 / 下

注:在此在根目录下进行目录的创建只有root才能进行,此时就将账号切换root来进行操作

在此使用ls -ld就可以不进行目录内部查看目录的属性

由于要进行不同用户之间的通信那就让其他用户可以在share_dir目录内进行文件的创建、删除和修改,因此就要将该目录other的权限修改为rwx

接下来就切换到普通账户zhz创建进行通信的文件communication.txt,并且将该文件的所属组下修改为xxy,在将other的文件权限全部去掉,这样就可以就可以使得该文件只能在zzh和xxy两个用户之间通信其他的用户都无法查看和修改

接下来登入xxy用户就可以进行zhz和xxy之间的通信

这时第三个用户想要查看communication.txt的内容就无法实现了

但是这时xxu就想你们不给我看,那我就把目录删了,谁也别看了

此时就出现问题了,xxu用户无法查看目录内的文件,却之间将对应的目录删除,这不是很反常理吗?

但是其实在目录当中删除文件的权限是由目录的w权限决定的,和目录内文件的权限无关,这就是更高维度的打击,删除你与你无关

但一般情况下我们是不用害怕出现以上类型的情况的,这时因为在普通用户的家目录当中其他人任何权限都没有,怎么能删除目录

因此为了解决在共享目录当中,用户没有查看文件的权力,却可以删除文件,Linux就引入了粘滞位

此时只要使用以下的指令就可以将目录加上粘滞位,这样就只要目录的拥有者才能将目录内的文件删除,除此之外其他普通用户都无法删除(root无视)

cpp 复制代码
chomd +t [目录]

以上就是本篇的全部内容了,接下来将会学习Linux基础的开发工具,未完待续......

相关推荐
律宏阔1 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔1 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴1 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千1 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei371 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei371 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei371 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化
GeW2 小时前
制造业高端化,为什么必须重估Linux和数据库?
linux
GeW2 小时前
工业场景中的Linux与数据库选型:高端化转型的技术底座
linux
yunwei372 小时前
eBPF 开发者教程: 简单的 XDP 负载均衡器
linux·后端·性能优化