【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. 该文件的所有者删除

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

相关推荐
南城花随雪。3 分钟前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了4 分钟前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度6 分钟前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮8 分钟前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
梅见十柒22 分钟前
wsl2中kali linux下的docker使用教程(教程总结)
linux·经验分享·docker·云原生
Koi慢热25 分钟前
路由基础(全)
linux·网络·网络协议·安全
传而习乎35 分钟前
Linux:CentOS 7 解压 7zip 压缩的文件
linux·运维·centos
soulteary37 分钟前
突破内存限制:Mac Mini M2 服务器化实践指南
运维·服务器·redis·macos·arm·pika
我们的五年1 小时前
【Linux课程学习】:进程程序替换,execl,execv,execlp,execvp,execve,execle,execvpe函数
linux·c++·学习
gma9991 小时前
Etcd 框架
数据库·etcd