【Linux】权限理解

大家好,我是苏貝,本篇博客带大家了解Linux的权限,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️


一.什么是权限?

就是通过一定的条件,拦住一部分人,给了一部分人权力,来访问某种资源。

比如:腾讯视频的vip能看一些非vip不能看的电影


二.权限的本质

权限同人/角色有关

权限同事物的属性有关

比如:你上课签到需要在学习通上,不能在腾讯视频上,因为学习通和腾讯视频的属性不同


三.Linux中的用户

1. Linux中的3中角色:拥有者 、所属组 、other

拥有者:你创建了一个文件,那你就是该文件的拥有者
所属组:首先讲解一下用户组的概念。用户组就是一组用户的集合,那为什么要把用户放入一个用户组中呢?当然是为了方便管理。大家想想,如果我有 100 位用户,而这 100 位用户对同一个文件的权限是一致的,那我是一位用户一位用户地分配权限方便,还是把 100 位用户加入一个用户组中,然后给这个用户组分配权限方便呢?不言而喻,一定是给一个用户组分配权限更加方便。

所属组类似,所属组内的所有人对同一个文件的权限相同
other:除了拥有者和所属组外的所有人

2. 具体的人

Root 超级管理员,不受权限约束

其它的都是普通用户

Root和普通用户之间可以进行身份的切换吗?可以的

普通用户变成root

1) su+输入root的密码

这样就是进行身份的变化,由普通用户变成root

2) su - 然后再输入root的密码

这样就是将root账号重新登陆

Root变成普通用户

Su/su- 用户名即可,不需要输入用户的密码

我不想变成root,但是我想以root的身份执行一个工作,这该怎么办?
用sudo提权

这里有2个问题:

为什么sudo对指令进行提权的时候,输入的是普通用户的密码,而不是root的密码?

跳过这个问题,我们来输入自己的密码,但系统会报错,说我们不在sudoers文件中,这又是怎么回事呢?

这两个问题我们暂时不解决,等学习的更深入,我们会知道的


四.Linux中文件的权限

权限=用户角色+文件权限属性

1. 前10个字符

我们知道,从拥有者开始往后的所有信息的意思,那拥有者前面的1和再前面的-rw-rw-r--是什么意思呢?

拥有者前面的1的意思我们后面再讲,先了解一下前面的10个字符

第一个字符:

-:表示普通文件

d:表示目录文件

剩下的9个字符:

先了解文件的属性权限(一般为3种):

r:读

w:写

x:可执行权限

剩下的9个字符3个为一组,分别对应:拥有者,所属组,other

拥有者字符:

第一个字符:是否具有读权限

如果是,就为r,否则为-

第二个字符:是否具有写权限

如果是,就为w,否则为-

第三个字符:是否具有可执行权限

如果是,就为x,否则为-

所以该文件拥有者具有读和写权限,没有可执行权限

所属组和other同理

该文件所属组具有读和写权限,没有可执行权限。Other只具有读权限,没有写和可执行权限

2. 快速掌握修改权限的方法:

首先我们要知道,一个文件的权限,谁能修改?
文件的拥有者和root

现在我们有下面这个文件,它的拥有者是我们自己,我们是普通用户

(a) 添加拥有者的可执行权限

U代表拥有者user

(b) 去掉拥有者的读写该文件的权限

(c) 去掉所属组对该文件的读写权限

G代表所属组group

(d) 增加所属组的读写和可执行权限

(e) 去掉other的读权限

O代表other

(f) 增加所有人的读写和可执行权限

A代表所有人all

(g) 去掉所有人的读写和可执行权限

上面用普通用户来举例,root修改权限的方法同普通用户

所以修改权限的方法:
Chmod u±rwx,g±rwx,o±rwx,a±rwx filename

当我们用2进制来表示三种角色的权限:

第一位字符是r,就为1,不是则为0

第二位字符是w,就为1,不是则为0

第三位字符是x,就为1,不是则为0

所以我们很轻易地写出了110 110 100

将每个角色的二进制改为八进制即:664

那如果有角色的八进制为7(111),那说明它有3种权限;八进制为1(001),说明它只有可执行权限;为2(010),说明它只有写权限......

(a)增加所有人的读写和可执行权限

(b)改变权限:

拥有者的权限:(1=001)可执行权限

所属组的权限:(2=010)写权限

Other的权限:(3=011)写权限和可执行权限

(c)去掉所有人的读写和可执行权限

3. 对比权限有无,表现:

(a)

从上面2张图我们可以看出:
对于普通用户,自身要受到相应权限的约束,即使这个文件是自己的

(b)

还是上图,虽然拥有者没有读写和可执行权限,但它在所属组里面,所属组有读写权限,那为什么拥有者还是没有读写权限呢?

因为Linux对用户的身份识别,只会识别一次。在拥有者里面发现zy没有读写和可执行权限,再在所属组里面就不会在对zy进行识别

(c)那root呢?会受到权限的限制吗?

对file.txt文件来说,root不是拥有者,不是所属组,所以root是other,other是没有读写和可执行权限的

但是我们发现root是有读写权限的,所以我们得出下面结论
Root不受权限约束

4. 修改权限的第二套做法

我们知道:权限=用户角色(具体的人)+文件权限属性

上面的快速掌握修改权限的方法是通过修改文件权限属性来完成的,现在我们来试试能否通过修改用户角色(具体的人)来修改权限

下面的命令是想将file.txt的拥有者变成普通用户zkj和超级管理员root

但是系统报错了,因为 把文件给别人是强制给的

所以我们要先用sudo提权或者用su变成root/su-登录root,来将文件强制给别人

(a)改变拥有者

(b)改变所属组

(c)同时改变拥有者和所属组

当角色为root或普通会员提权到root时:

Chown username filename

Chgrp username filename

Chown username1 : username2 filename

5. 文件类型

(a)了解文件类型

在介绍Linux的文件类型之前,请大家思考一下,Windows是如何区分文件类型的?

答案很简单,是通过文件的后缀名

那Linux呢?

Linux不通过后缀区分文件类型(不是说Linux不用后缀名)

那Linux通过什么区分呢?答案是ls-l结果的第一个属性列

Linux文件类型:

-:普通文件:文本文件、可执行程序、库等

d:目录文件

b:块设备文件

c:字符设备文件

p:管道文件

l:链接文件

我们暂时是需要知道上面那2种文件类型,其它的看看就行。

我们进入下一个问题,当log.c的内容是下图时:

将log.c重命名为log.txt,然后再用gcc编译

我们发现,gcc编译失败。不是说Linux不用后缀名来区分文件类型吗?那为什么会编译失败。因为Linux不用,不代表gcc不用。Linux系统!=gcc

总结:Linux不通过后缀名区分文件类型,但Linux上的工具可能通过后缀名来区分

(b)如何理解可执行权限x

可执行权限等于可执行吗?

我们发现,虽然a.out和test.txt都有可执行权限,但是只有a.out能执行,test.txt不能被执行。所以可执行权限!=可执行

能执行=具有可执行权限+本身是个可执行文件

(c)如果我们要进入一个目录,我们需要什么权限?

总共就3种权限,用控制变量法一个一个试吧

我们新建一个目录a/b/c,发现对拥有者,默认有3种权限

现在我去掉读权限,发现能进入目录a,能新建/修改/删除文件,但是不能读取目录a下的文件信息

现在恢复读权限,去掉写权限。发现也能进入目录a,可以读取目录信息,但是不能新建/修改/删除文件

再恢复文件的写权限,去掉文件的可执行权限,我们发现,这时就不能进入目录a了

所以我们要进入一个目录,需要可执行权限x

目录的r属性:决定用户能否查看指定目录的文件信息

目录的w权限:决定用户是否能够在指定目录下新建/修改/删除文件

(d)Linux创建文件的时候,为什么好像有默认权限?为什么是我们看到的样子

创建的普通文件,起始权限是:0666

创建的目录文件,起始权限是:0777

不管前面的0,普通文件是666(110 110 110),所以3种角色都没有可执行权限;普通文件是777(111 111 111),所以3种角色都有可执行权限;

接下来让我们了解一下Linux中的默认权限掩码,我的Linux的默认权限掩码是0002,如果你们的不是0002也是正常的

创建文件的时候,要从起始权限中,过滤掉 (不是简单的减法) 在umask中出现的权限

Umask不管最前面的0,就是002(000 000 010)

最终权限=起始权限&(~umask)

(e)为什么普通用户能删掉别人的文件(包括root)?这合理吗?

前提1:拥有者为zy,3种角色都有3种权限的目录222

前提2:普通用户zkj在zy创建的文件222中新建一个文件zkj.txt。此时zy属于other,只有读权限

前提3:超级管理员root在zy创建的文件222中新建一个文件root.txt。此时zy属于other,只有读权限

那普通用户zy能否删掉zkj.txt和root.txt文件呢?想要删除需要w,zy都没有写权限,那应该是不能删除的,事实真是这样吗?

咦?zy怎么能删除呢?它不是没有写权限吗?

原来,删除一个文件和目标文件没有关系!!!和想要删除的文件所在的目录有关

我们上面有说过:

目录的w权限:决定用户是否能够在指定目录下新建/修改/删除文件

所以,只要普通用户zy在想要删除的文件所在的目录222有w和x权限,就可以删除掉目录222里的所有文件

(f)如果我们想在Linux下,建立一个有多个用户可以操作的共享文件,来被大家共同访问,怎么办?

  1. 能否将该共享文件建立在某一个用户的家za目录下?
    不行,因为用户不能访问其他用户的目录(su 用户可以,但是需要知道对方的密码)

所以只能在系统的非用户目录下创建(最好让root创建)。为了让多个用户都可以操作这个文件,所以root要将other对文件的权限设置为rwx

普通用户zy想在111_shared创建文件zy.txt,并想让普通用户zkj能读

Zkj此时能读了,但是另一个普通用户mm看见了这个文件,并想把zy.txt删除,它能删除吗?可以的,因为zy.txt所在的目录111_shared对other的权限是rwx。那有什么方式能够阻止mm删除zy建立的文件呢?

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

当111_shared被设置为"粘滞位" (用chmod +t) 后,mm还能不能删掉zy建立的文件?不能

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

  1. 超级管理员删除
  2. 该目录的所有者删除
  3. 该文件的所有者删除

好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

相关推荐
大王只是带我巡了个山8 分钟前
优化 OR 条件过多导致的查询超时
数据库·mysql·join·or 优化·or 超时·查询超时
hgdlip13 分钟前
电脑ip会因为换了网络改变吗
服务器·网络·tcp/ip·电脑
EterNity_TiMe_17 分钟前
【Linux基础IO】深入Linux文件描述符与重定向:解锁高效IO操作的秘密
linux·运维·服务器·学习·性能优化·学习方法
python-码博士17 分钟前
Rosetta 一:手把手教你用Linux安装Rosetta(全网最简洁)
linux·运维·服务器
你可以自己看22 分钟前
python中函数式编程与高阶函数,装饰器与生成器,异常处理与日志记录以及项目实战
服务器·开发语言·python
gma99936 分钟前
MySQL程序
数据库·mysql
神秘的土鸡39 分钟前
Linux中Docker容器构建MariaDB数据库教程
linux·运维·服务器·数据库·docker·mariadb
汪公子49239 分钟前
使用k8s搭建mariadb+nginx+wordpress
数据库·nginx·mariadb
Java__攻城狮44 分钟前
navicat无法连接远程mysql数据库1130报错的解决方法
数据库·mysql
爬山算法1 小时前
Oracle(129) 如何使用闪回归档(Flashback Archive)?
数据库·oracle