文章目录
- 📖 前言
- 1. 什么是权限
- 2. 权限管理
- 2.1 Linux的用户分类:
- 2.2 Liunx文件的分类:
- 2.3 文件的访问权限
- 2.4 文件访问权限的相关设置方法:
- chmod对文件权限的修改
- chown / chgrp
- 2.5 以八进制修改文件权限:
- 2.6 默认权限:
- 2.7 目录权限管理:
- 3. 粘滞位
- 4. file指令
📖 前言
本章开始我们正式开始学习Linux
,在日后的学习中我们将陆续学习Linux系统编程和网络编程
……
基本指令我们就不再过多赘述,指令只要经常用就会熟能生巧,所以我们也就不必过于关心指令记不住的问题,我们直接开门见山,从重点抓起,本章我们将介绍Linux的权限管理
……😉😉😉
所有演示均在CentOS7.6下进行 ~
1. 什么是权限
日常生活中的权限:
在我们日常的生活中,我们所接触的权限有,例如:某某视频软件,有的视频是需要vip客户才能观看,普通用户却看不了,这就是权限。
但是这种理解还是不够到位:
- 如果想要对某些文件具备某些权限,对应的事物需要具备对应的属性。
- 如果一个事物天然不具备某种属性,那么这种属性的权限也便无异议。
例如:某某视频软件连看视频的功能都没有,再对看视频划分各种vip,这种权限也便无意义。
此时我们就对权限有了一个较为深刻的认识那就是~
到底什么是权限?(重点)
- 约束人的(对人进行分类)
- 需要对应的事物具有特定的属性
2. 权限管理
2.1 Linux的用户分类:
Linux下有两种用户:超级用户(root)、普通用户(user):
- 超级用户: 可以再linux系统下做任何事情,不受限制
- 普通用户: 在linux下做有限的事情
超级用户的命令提示符是 “ # ” ,普通用户的命令提示符是 “ $ ”
其中超级用户root,其权限是最高的,他可以为所欲为,他可以下载一些程序为所有子用户使用,但是其他子用户却不行,子用户想切到root账号,必须输入密码,root切到子用户是直接进的。
同时还可以以子用户的身份对其文件操作,神不知鬼不觉间实现偷鸡换蛋,而且root无视子用户的所有权限。
2.2 Liunx文件的分类:
Linux系统不是以文件名 “ 后缀 ” 区分文件类型的,而是通过ll指令
显示的 “ 第一个字符 ” 区分文件类型的!!
第一列的第一个字符,叫做文件类型!
- : 普通文件,文本,源代码,可执行程序,第三方动静态库等
d: 目录文件
l: 链接文件
p: 管道文件
b: 块设备文件,磁盘
c: 字符设备文件
注意:
- Linux不以文件后缀区分文件,并不代表gcc这样的编译器不做要求,系统关系后缀,但是在系统上跑的工具需要后缀。
- Linux不以后缀区分文件类型,也可以成Linux并不排斥以后缀作为文件类型。
2.3 文件的访问权限
Linux中人分为三类:
- 文件的拥有者:owner
- 文件的所属组:grouper
- 文件的其他用户:other
Linux系统中, 文件的权限属性,分:
- r(read - 可读)
- w(write - 可写)
- x(execute - 可执行)
那我们该如何描述一个文件的权限呢?
- Linux对文件的权限有:
-
- 这个文件谁能 “ 访问 ”
-
- 这个文件谁不能 “ 访问 ”
- 对应的文件应该具备的某种属性:
-
- r,w,x
高度的概念:权限 = 人 + 事物属性
所以权限的概念以及操作,都是围绕着人和文件属性展开的!
描述文件权限的时候,既要涉及到人,又要涉及到这个文件的属性。
我们已经知道了第一列是文件的类型,我们将后面九个字母三三分为一组,那么后面的字母是什么意思呢?
- 第一组,第一个字符只能是 r / - ,第二个只能是 w / - ,第三个是能是 x / -
- 第一个代表是否可读,第二个代表是否可写,第三个代表是否可执行
- 如果可以,对应位置上就是对应的字符,如果不可以,就是用 " - " 表示
三个字符为一组,确定了【拥有者 / 所属组 / 其他】所具有的权限(可读,可写,可执行)
为什么会有所属组的概念:
当几个组共同开发一个项目的时候,就会在同一个服务器上共同实现,那么有的文件内容需要组内互相通气,但是又不想让别的组知道本组的文件内容,就有了所属组的概念。
所属组是为了在linux中为了协同,在组内公开,区域性公开,而不是暴露给所有人。
2.4 文件访问权限的相关设置方法:
chmod对文件权限的修改
chmod:
功能: 设置文件的访问权限
格式: chmod [参数] 权限 文件名
用户表示符+/-=权限字符:
+:向权限范围增加权限代号所表示的权限
-:向权限范围取消权限代号所表示的权限
=:向权限范围赋予权限代号所表示的权限
用户符号:
u:拥有者
g:拥有者同组用
o:其它用户
a:所有用户
同理,我们也可以将权限加回去:
chmod u+r file.txt
对所属组和other也同样适用:
chmod g-r file.txt
chmod o+x file.txt
批量修改成同一个权限,还可以使用a来指定all:
chmod a=rwx file.txt
此时所有人的所有权限就都加上了:
chown / chgrp
文件的创建者和文件的拥有者一定是同一个人吗?
- 并不一定,也就是说我们可以将一个文件交由其他人或组去管理。
chown:
功能: 修改文件的拥有者
格式: chown [参数] 用户名 文件名
chgrp:
功能: 修改文件或目录的所属组
格式: chgrp [参数] 用户组名 文件名
显而易见,我们并不能随便把文件给别人,或者不能随便把文件更换所有组,不过我们可以通过超级用户root,它可以直接强制将文件给任何人。
2.5 以八进制修改文件权限:
有了上述的讲解,我们知道,每类人的某一个权限,要么有要么没有,用对应的字母和 - 标识,那我们就可以像之前学的位图和布隆过滤器时那样,有就用1标识,没有就用0标识。
这样的话,每类人的权限一共有三个,每个人都有两种情况,那么这三个二进制数字(因为要么是0,要么是1),可表示的范围是:[000 - 111](二进制),[0 - 7](十进制)。
因为三个二进制位可以替代一个八进制位,所以这三类人的权限我们还可以用三个八进制的数字表示。
2.6 默认权限:
我们来创建一个目录和一个文件:
为何我们创建目录的默认权限是这个样子的:775
,为何我们创建的普通文件的默认权限是:664
?
这和权限掩码有关系~
权限掩码:
重点:
- 默认目录的起始权限:777
- 默认普通文件的权限:666
- 默认权限 != 最终权限
我们将默认权限和umask的二进制都拿出来:
看起来非常像减法,但是这真的是减法吗??
答案:这里不是减法,而是:
默认权限 = 默认权限 & (~umask)
umask
是支持修改的:
- 所有能够灵活调整创建文件默认权限的方式,都是为了让用户使用起来更方便,为了创建特殊文件的时候方便。
我们来验证一下:
2.7 目录权限管理:
在Linux下,有一句话那就是:一切皆文件。那目录也是个文件,也就是说我们也可以像管理文件那样把目录管理起来。
- 可执行权限: 如果目录没有可执行权限,则无法cd到目录中。
- 可读权限: 如果目录没有可读权限,则无法用ls等命令查看目录中的文件内容。
- 可写权限: 如果目录没有可写权限,则无法在目录中创建文件,也无法在目录中删除文件。
注意这里是,如果目录没有可执行的权限就无法进入目录,这是比较特殊的。
归类总结:
- 如果目录贝没有r权限,允许进入,允许在该目录下创建(写入)一个文件,不允许查看
- 如果目录只没有w权限,允许进入,允许在该目录下查看文件列表,但是不允许创建文件
- 如果同时没有rw权限,允许进入,但是不允许创建和查看目录下的文件列表
注意:不是文件内容!!!文件的内容,是否可以查看,由文件自己的权限决定!!
3. 粘滞位
当多组共同在同一个目录下操作时,Linux下可以存在一些目录,拥有者和所属组是root或是其他人,但是其他人允许以other的身份在该目录下进行文件的创建,读取,删除,修改等!
首先我们先来看看这两个用户的文件权限:
都是other可以进入目录,可读可写的。
- 首先,Zh_Ser,在自己的家目录下创建了一个all目录,创建出来的目录other是可读可写可进入的,随后在all目录下创建了一个文件,在里面写了东西,并设置这个file.txt文件other没有任何权限。
- joker随后也进入到Zh_Ser目录中的all目录中,joker尝试读all目录中的file.txt文件,发现这个文件并不可以读,也并不可以写,于是joker恼羞成怒,直接将file.txt这个文件给删了。
- 此时Zh_Ser再次进入all目录,发现file.txt不见了~
- 这种删别人文件的做法不好,但是在一些特定场景下,需要共同开发,就是要共享目录。
- 在一个共享目录下,你不让我写,不让我读,但防不住我删除!
这种老6行为我们不提倡!我们也有办法防一下,那就是粘滞位~
- 如果我还想在共享目录下,形成临时文件
- 但是,不允许除了我之外的人删除!
给共享的<目录>加上粘滞位!(用chmod + t)
此时其他用户就不能删了:
此时joker对file.txt文件看不了,改不了,即使恼羞成怒也不能把它删了~
不过此时Zh_Ser是可以删的,因为它是目录的管理者,文件的拥有者:
此时该目录下的文件只能由:
- 超级管理员删除
- 该目录的所有者删除
- 该文件的所有者删除
4. file指令
除了用文件属性的第一位来查看我们文件的属性之外,还可以用file命令来查看更加详细的文件属性。
我们写一段代码,他可以告诉我们这是什么文件:
告诉我们这是个C语言代码,ASCII文本。
常用选项:
-c: 详细显示指令执行过程,便于排错或分析程序执行的情形
-z: 尝试去解读压缩文件的内容