Linux权限

03-01 1863阅读

前言

前几篇博文我们已经对Linux的指令以及shell的运行原理介绍清楚了,本期我们来介绍一下Linux中的权限问题!

本期内容介绍

什么权限?

Linux下的用户

Linux下的文件访问角色

Linux下文件类型

文件权限

权限掩码

目录权限

粘滞位

一、什么是权限?

权限就是通过一定的条件,限制一部分人的某些行为,从而给另一部分人权利,去访问某种资源。即有还是没有,能还是不能的问题!

例如生活有很多关于权限的例子!假设你今天想要听音乐,你没有vip,人家是不让你听的,有vip的那部分人又可以听!还有就是你玩的csgo、王者荣耀、吃鸡、英雄联盟、CF等好多的游戏里面是不是有皮肤呀!你没有买你是不可以用的,你没有使用的权限,已经购买的人就可以使用,因为人家有了使用的权限!

权限的本质

权限的本质与两方面有关:1、与人(角色)有关。   2、与事物的属性有关

结合两点就可以得出:权限 = 人(角色) +  事物的属性

什么意思呢?我来解释一下:

1、角色:你不可以在QQ音乐里面听音乐,和你是叫张三、王二狗有关系吗?和你是哪里人有关系吗?和你是男女有关系吗?是不是没有关系啊!人家只看你是否是vip有关,也就是vip是用来区分用户角色从而看是否给你操作的权限的!

2、事物属性:你今天学习学累了,想要刷刷短视频来缓解一下压力,你去leetcode把会员充爆,他能给你提供吗?是不是不行啊!为什么呢?我已经充会员了呀!我有操作权限了啊!是的你是有权限了,但人家压根就没有提供这个刷视频的属性,你干再多也是白干~!

所以一个事物要谈权限之前他自身必须要能够提供相应的属性功能!

权限存在的意义

大家有没有想过问什么要存在权限?也就是权限存在的意义是什么?

权限存在的意义是:保证普通用户文件数据的安全性!

二、Linux下的用户

Linux下的用户分类(具体的人)

Linux下的用户分为两种:超级用户(root)和 普通用户

超级用户:可以在Linux下做任何操作,不受限制!

普通用户:在Linux下做操作时,只能做有限的操作,即它的行为受限制!

注意:超级用户的命令行的提示符是"#", 而普通用户的是"$"

Linux权限

Linux下的用户切换

su [用户名字]  或 su - [用户名]

如果是root切换到普通用户的话不用密码直接指向上述的两个操作即可,普通用户切换到root要输入root的密码,普通用户切换到另一个普通用户要输入被切换的那一个的密码!

总结:root切换不受限制; 普通用户要切换成谁,就要输入谁的密码!!!

验证一下:

root切换普通用户(su 用户名)

Linux权限

普通用户切换root(su)

Linux权限

普通用切换普通用户(su 用户名)

Linux权限

root切换到普通用户(su - 用户名)

Linux权限

普通用户切换root(su - root)

Linux权限

普通用户切换普通用户(su - 用户名)

Linux权限

这里既然两者都可以切换用户,那有什么区别吗?有的!

su 用户名后不会改变当前用户的家目录, 而su - 用户名,会改变成要切换的用户的家目录!

Linux权限

Linux权限

指令暂提权

我们有时候不想直接变成root,就想以root的身份执行一条指令!我们该如何处理呢?这就是我们介绍的sudo 对指令暂提权!

sudo 一般的指令

在提取权时我们不需要输入root的密码了!只需要输入自己的密码即可!由于目前我们还没有介绍vim无法把我自己的普通用户添加到Linux的“白名单里”所以无法演示!后面添加了,我会在vim那里演示的!

这里有两个问题需要介绍一下!

第一:既然普通用户在一般的指令前加个sudo 就可以以root身份执行了!那是不是root就形同虚设了呀!答案是不是的,不是你所有的指令前+sudo操作系统就会一定执行!他也会做评估的!!!就像C++那里的内联函数一样,不是你给我给我加inline我就一定是内联的,而是我会进行判断的!!

第二:既然你把我加到白名单里面了我可以以root的身份执行了,为什么不直接把root账号给我呢?这里主要澄清的是把你加到白名单里是给你方便用,和直接给你root账号是两码事!!!例如我有一件物品你正好频繁使用我借给你和我给你是两回事!!这里不直接给你的原因是:假设你有一天犯病了,把所有都给删了!另外或者你的账号被盗了如果你是root那这台服务器的定西就等于在别人面前裸奔!!!所以给你加到白名单里即使你出现上述情况,root也会即使处理!!!

三、Linux下的文件访问角色

我们上面介绍了:权限 = 角色 + 事物的属性!而Linux一切皆文件!所以事物的属性在Linux下就是文件的属性!那角色呢?Linux下文件的角色可以分为三类!分别是:文件的拥有者、所属组、other!这些角色还是我们上面介绍的用户来扮演的!!!

Linux权限

Linux权限

除了拥有者、所属组之外的所有角色都是other!!例如:

Linux权限

test.c的拥有者是root、所属组是root,也就是除了root的其他人都是other !!!

为什么要有所属组?

这里拥有者、other我都可以理解!拥有者就是这个文件属于谁嘛!other就是这个文件相对的其他人嘛!这都可以理解,这个所属组是什么呢?

所属组类似于群,只要是群里的成员,我们就可以共享文件!

举个栗子:

假设你们公司现在要来开发一款类似于wx一样的聊天软件,分为两组来开发,你们组的组长有一天过来问你,小陈啊!代码写的咋样了?我能不能看看?你想了一下说老大不行啊!隔壁组和我们使用同一台服务器,我的这个文件的拥有者所属组也都是我,我如果,把权限放开的话隔壁组的张三驴也会看到!!你的组长想了一下说能不能把我们两个搞一个类似于群的东西,这个文件只有我们两个可看?这里的群就是所属组!你就把你的文件的所属组修改成了你的老大!此时你的老大就也可以看了!(关于如何修改,马上下面会介绍!!!)

Linux权限

此时cp用户就可以查看了!

文件对于用户角色只识别一次

什么意思呢?就是一个文件你既是拥有者又是所属组并且有相应的文件权限时,你可以对其进行操作!但假设你把拥有者的权限都给去掉了后,所属组的不变!你发现你对这个文件操作不了了!因为文件只对身份进行一次的识别!默认先是拥有者再是所属组!

这里我先用一下修改文件的操作,下面会介绍!!!

Linux权限

当前的文件是拥有者和所属组都是cp,文件权限都是可读、可执行!我们现在是可以在cp用户上可读f.txt的!

Linux权限

现在我们把f.txt的拥有者的权限修改了看看他还能不能读了!

Linux权限

如何修改文件的访问角色?

接着上面的问题,你的领导想看你的代码,但你的文件的所属组和拥有者都是你!上面说了把你的领导设为所属组即可!但如何把你的老大设为所属组呢?这就是我们将要介绍的文件角色的修改!

一个文件的权限谁能修改?

1、文件的拥有者

2、root

这里很好理解的,我的我当然随意修改,root是不受权限的也可以!除此之外一律不可修改!

修改拥有者:chown 修改为谁 文件名

Linux权限

修改所属组:chgrp 修改为谁 文件名

我们可以吧刚那个test.cpp的所属组也修改为cp:

Linux权限

OK,修改角色的权限就只有这两个!有的伙伴就会有疑问了:怎么没有other的?原因是other太多了不是具体的一部分人,所以根本不需要!如果有需要你直接把他改成拥有者所属组即可!

四、Linux下文件类型

Linux下常见的文件类型有6种,分别如下:

- 开头:普通文件。包括文本、视频、图片、各种库等

d 开头:目录文件

b 开头:块设备文件(磁盘)

c 开头:字符设备文件(显示器等)

p 开头:管道文件

I  开头:链接文件(类似于win快捷键)

OK,我们一一看看:

Linux权限

我们知道在win下也有目录、文本、图片、视频等文件!win是通过后缀区分文件类型的,我们在上面看到了,Linux不是通过后缀来区分文件的,那是不是说明Linux下不需要后缀呢?答案是不是的,Linux是不需要,但Linux上的软件是需要的!举个例子验证一下:

假设Linux上的软件工具也不通过后缀区分文件类型:

Linux权限

我们发现通过g++来编译test.txt文件时,不可以编译过,原因是文件的格式有问题!!这就说明了g++应该是区分文件的后缀的!我们在改成cpp后缀看看!!

Linux权限

修改后我发现可以了!!!这也和我们前面的介绍一致!!!

五、文件权限

文件的权限

我们前面也介绍了,权限 = 角色 + 事物属性!Linux下一切皆文件,所以事物属性就是文件属性!角色就是拥有者、所属组和other!所以文件权限就是角色拥有的相应的对文件操作的权限了!

文件的权限一般有三个:可读(r)、可写(w)、可执行(x)。

如何查看角色的文件权限呢?我们有必要把我们平时ls-l指令看到的一行东西介绍一下了!

Linux权限

开头的10个字符中,第一个表示文件的类型,剩余9个三三一组分别表示拥有者、所属组、other的文件权限!r表可读,-表示不可读;其他同理!后面的l是软链接(后面会介绍),后面的两个是拥有者和所属组,在后面的那个数字是文件的大小,后面的日期是最近修改/创建的文件的时间,最后是文件的名字!!!

OK,举个栗子:

Linux权限

如何理解x权限?

你说rw和我都可以理解读写嘛!一个文件我给他对应的角色加一个r就可以读了,加个w就可以写了,w同理!这个x可执行是啥啊?如何理解呢?

我给一个文件加一个可执行权限我这个文件就可以被执行了???

显示不是的,我们前面介绍过:权限 = 角色 +文件属性!加上x是给角色给了可执行的权利但文件也得是一个可执行文件呀!我自身都不是可执行文件还谈什么权限?

文件权限的修改

在讨论文件权限修改之前我们先来回顾一下上面修改文件角色的那里的一个问题:

一个文件的权限谁能修改?

1、文件的拥有者

2、root

这个也很好理解!这个文件是我的(拥有者),我当然可以修改权限!root说我感受不到权限的存在,因为我就是权限!

如何证明上述的说法呢?我们先不验证,先来介绍如何修改权限,等介绍完了如何修改,我们再来验证!!!

文件权限的修改,有两种方式!

1、chmod u +\- rwx    chmod g +\- rwx    chmod o +\- rwx    chmod a +\- rwx    + filename

这里的u是user,g是group,o是other,a 是 all

2、我们发现三种角色正好是3位,如果有相关权限表示1,没有表示0的话。那他的每一种角色的最大权限是111也就是7,不会超过7。所以可以把三种角色相应的权限换算成8进制来修改!

例如:chmod a + 777 filename

OK,我们来验证一下:

当前这个文件是什么也没有:

我们可以对他加上r和x

Linux权限

当然我们也可以全部加上:

Linux权限

我们也可以去掉other的所有权限:
Linux权限

OK,这就是第一种方式!OK,我们再来操作一下第二种:

此时f.txt是拥有者只有读写,无执行。所属组和other只有读。

Linux权限

我们给拥有者加上执行权限,所属组加上所有权限,other去掉所有权限:
Linux权限

果然成功了,我们当让也可以给每个角色都设置成可读:
Linux权限

OK,这就是文件属性的权限修改的两种方式!

六、目录权限

介绍完了文件权限咱们再来介绍一下目录权限!

Linux权限

他也和文件一样,有三种角色!拥有者、所属组、other。这里我就直接先介绍结论在验证了!

可读权限(r) :  目录角色有r权限就可以查看,文件中的文件内容!例如执行:ls、ll等

可写权限(w) : 目录角色有w权限就可以,在该目录里进行新建和删除文件!

可写权限(x):  目录角色有x权限就可以进入该目录了!

OK,我们一个一个的验证一下:

这里有一个目录,我们发现此时三种角色都有r权限,也即是说都可以查看目录中的内容!

Linux权限

有r权限:

Linux权限

没有r权限:

Linux权限

OK,再来验证一下:w权限

有w权限:

Linux权限

OK,我们再把拥有着的w权限去掉看看:

Linux权限

这是我自己的我可以删除正常!那root有一天的我的目录下创建一个文件我能不能删除呢?答案是可以的!

删除一个文件和这个文件没有关系,和这个文件在那个目录有关,如果该目录的角色拥有w权限都可删除你!!!不关你是不是root创建的!!

OK,我们最后来看看x权限:

有x权限:

Linux权限

再看看没有x权限的!

Linux权限

七、权限掩码

我们发现每次新建的文件和目录都有一些默认的权限!

Linux权限

这里是我刚刚新建的一个文件和一个目录!我们可以明显的看到文件的默认权限是644,目录的默认权限是775;我们想不是文件应该是0666吗?目录不应该是0777吗?这为什么和我们想的不一样呢?其实这里是由于umask影响的!

什么是umask?

umask 是一种权限掩码,用来确定文件或目录新建后的起始权限的!

umask的作用:查看或修改文件或目录的权限掩码!

查看: umask (root的是0022, 普通用户的是0002)

修改: umask  [权限值]--->8进制

说明:从默认的权限中去掉umask就是我们看到的默认权限了!

Linux权限

上面说到了新建文件/目录的起始权限 = 默认权限去掉umask出现的,这里的去掉是什么意思?

注意这里的去掉不是单纯的减去!!!而是: 最终权限 = 默认权限 & (~umask)

OK,我们一起那个栗子看看:

Linux权限

OK,我们再来看一个root的普通文件的:

Linux权限

起始这个也可以自己修改:我们可以整个000看看:

Linux权限

我们再来创建一个文件看看:

Linux权限

此时它的权限是666就和一开始的默认权限一样了!!!

八、粘滞位

假设今天有个这样的需求,我们想要在公司内多成员共享一个文件!首先这个文件是不可以在每个用户的家目录下的!因为如果在普通用户的家目录下的话除了root其他普通用户是无法进入的,也就不可以共享了!!

Linux权限

所以我们不能在普通用户的家目录里创建!我们只能在系统的非用户的目录下创建!例如:tmp目录下创建个test.c!

Linux权限

Linux权限

这是系统提供好的一个,是一个非常完善的!当然除此之外我们普通用户不可以新建,但root

可以的!

Linux权限

但是我们看到了,这个文件的所属组和other 的权限是没有w的,这就导致普通用户无法新建更就谈不上共享了!所以我们必须给其加上w权限:

Linux权限

此时普通用户就可以在这个目录里新建文件和共享文件了~!

Linux权限

但是sq用户有一天误操作将正在共享的文件给删除了!这就导致其他正在共享的人,也无法看了!

Linux权限

那如何解决被误删的问题呢?有的伙伴想到说上面介绍了目录的w权限可以删除和新建文件!防止误删我们可以把other的w去掉!是的这样确实可以解决误删的问题!但前提是你得有普通用户新建的文件呀!other没有w权限你压根进不去创建,还谈什么删除呢?显然这是不行的!为了解决这个问题,引入了粘滞位!

设置目录的粘滞位:chmod +t filename

Linux权限

此时,普通用户创建一个共享文件后,别的普通用户就不能随便删除了!

Linux权限

假设此时sq用户又想偷偷的“误删”,试一下:

Linux权限

现在就是操作不被允许了!当然root无视权限,root可以删除,这个毫无疑问!

总结:当一个目录文件设置了粘滞位后,改目录下的文件只能由:

一、超级管理员(root)删除

二、该目录的拥有者可删

三、该文件的拥有者可删

多数情况下,一和二是同一种角色!三也很好理解,这个文件是我的我当然可删!

Linux权限

OK,权限介绍到这里就结束了!!好兄弟我们下期工具篇再见!!

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]