🌠 作者:@阿亮joy.
🎆专栏:《学会Linux》
🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根
目录
- 👉shell命令以及运行原理👈
- 👉Linux权限的概念👈
- 👉Linux权限管理👈
- 文件访问者的分类(角色)
- 文件类型和访问权限(事物属性)
- 1.文件类型
- 2.基本权限
- 文件权限值的表示方法
- 1.字符表示方法
- 2.8进制数值表示方法
- 文件访问权限的相关设置方法
- 文件相关指令
- 1.file指令
- 2.umask指令
- 目录的权限
- 粘滞位
- 👉总结👈
👉shell命令以及运行原理👈
其实,我们平时敲的指令都是可执行程序,都是用 C语言或 C++ 代码写的。那这些指令是什么在 shell 上运行起来的呢?shell 又是什么呢?
Linux 严格意义上说的是一个操作系统,我们称之为“核心(kernel)” 。但我们一般用户,不能直接使用 kernel。而是通过 kernel 的“外壳”程序,也就是所谓的 shell,来与 kernel 沟通。如何理解?为什么不能直接使用 kernel 呢?
从技术角度, shell 的最简单定义:命令行解释器(command Interpreter)主要包含:
- 将使用者的命令翻译给核心(kernel)处理。
- 同时,将核心的处理结果翻译给使用者。
对比 Windows GUI,我们操作 Windows 不是直接操作 Windows 内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符或者运行起来一个应用程序)。
而 shell 对于 Linux,也有着相同的作用,主要是对我们的指令进行解析,将指令解析给 Linux 内核。Linux内核运行的结果通过 shell 解析给用户。
- 帮助理解:假如你是一个闷骚且害羞的程序员张三,那 shell 就像媒婆,操作系统内核就是你们村头漂亮的且又让你心动的姑娘如花。你看上了如花,但是有不好意思直接表白,那就让你你家人找媒婆帮你提亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给如花,而我们找到媒婆姓王,所以我们叫她王婆,她对应我们常使用的 bash。张三不能和如花直接沟通,就如同用户不善于和操作系统打交道,也不能直接和操作系统进行交互。
shell 除了降低用户和操作系统交互的成本,还有一个作用就是变相保护操作系统。因为当用户输入一些非法指令时,shell 就会拒绝执行该指令,这样就起到保护操作系统的作用了。
一般而言,shell 本身并不执行对应的指令,而执行指令是通过派生子进程的方式执行用户的指令。这样做是为了保护 shell。shell,是命令行解释其的一个统称,而 Centos 7 采用的命令行解释器是 bash。当用户登录成功后,第一个在系统上跑起来的程序就是 bash。
一个标准的 shell 命令提示符的组成格式
👉Linux权限的概念👈
Linux 下有两种用户:超级用户(root)和普通用户。
- 超级用户:可以在 Linux 系统下做任何事情,不受限制
- 普通用户:在 Linux 系统下做有限的事情,受权限的约束
- 超级用户的命令提示符是“#”,普通用户的命令提示符是“$”
命令: su [用户名]
功能:切换用户。 例如,要从 root 用户切换到普通用户 user,则使用 su user。
要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root用户的口令。
注:当从普通用户切换到 root 用户(su、su root 或者 su - 指令),需要输入 root 用户的密码;而当 root 用户切换到普通用户(Ctrl + d 或者 su 普通用户名),则不需要输入普通用户的密码。因为 root 用户的权限是最高的。su 和 su root 指令切换到 root 用户的时候,并不会改变所处的路径,而su - 指令切换到 root 用户的同时将路径改为 root 的家目录,即 /root
当我们是 root 用户时,输入 ls /home 可以查看所有的普通用户。
当我是普通用户,我想要 root 用户的身份执行一条指令,但不想变成 root 用户,怎么办呢?那么我们可以使用 sudo 指令,该指令的使用需要改配置文件。当我们学了 vim 工具,再来做这个操作。
当我们第一次使用 sudo 命令时,是需要输入普通用户的命名的;当使用 sudo 命令时间间隔较短时,就不再需要输入普通用户的密码了。
没有将普通用户添加到配置文件中的情况
这种情况就相当于系统不信任这个用户,那么如何解决这种情况呢?我们需要将当前用户添加到配置文件 /etc/sudoers 中,现在我们暂时不配置,先使用 root 用户来进行操作。
那我们使用 sudo 指令进行提权的时候,让我们输入自己的密码,这是为什么呢?这是给受信任的普通用户提供最少的执行障碍,保护操作系统。
什么是权限?
- 权限是约束人的(某一个人或者某一类人)。例如:非会员不能看需要会员才能看的电影,不能听会员才能听的音乐等等。
- 目标对象(电影网站、音乐APP等)本来就没有对应的属性(业务)。例如:你不可能在电影网站上做 OJ 题。因为电影网站没有这样的业务,那么你也就没有在电影网站上面做 OJ 题的权限。
- 通俗来说,权限就是一件事情是否允许被谁做。例如:Linux 的文件权限 = 人(角色) + 文件属性。
👉Linux权限管理👈
文件访问者的分类(角色)
一个人能做什么事,并不取决于这个人的名字是什么,而是取决于这个人的角色。比如:张三是某个学校的校长,他能够进入校长办公室,是因为他名字是张三就能够进入校长办公室吗?并不是,是因为他的角色是校长,所以他能够进入校长办公室。换了另一个张三,就不能进入校长办公室了。
那文件的访问者(角色)的分类有什么呢?
- 文件和文件目录的所有者: u—User(拥有者)
- 文件和文件目录的所有者所在的组的用户: g—Group(所属组)
- 其它用户: o—Others (其他人)
那普通用户和上面的三类访问者是冲突的关系吗?并不是,某个用户可能是一个文件的拥有者,也有可能是另一个文件的所属组或者其他人。文件的访问者是一种角色,或者说是一种身份,普通用户可以被赋用不同的角色(省份)。而操作系统约束的就是角色,并不是特定的普通用户(人)。
那么文件的三个角色究竟在哪呢?我们来看一下:
注:不属于拥有者和所属组的用户就是其他人。
为何要存在所属组?
在一个公司里,会存在两个团队做一个项目,那么谁把这个项目做更好,这个项目就归属于谁。那么团队 A 有团队 A 的代码目录,团队 B 也会有团队 B 的代码目录。这时候,就肯定需要所属组这样的概念。如果没有所属组这样的概念,那么其他团队的成员也能够看你们团队的代码了。所以所属组的概念也就必须存在。
文件类型和访问权限(事物属性)
文件 = 文件内容 + 文件属性。文件的属性包括读权限(r)、写权限(w)和可执行权限(x)。
那么,我们输入ll
指令,显示器上显示的都是文件的属性。
1.文件类型
- d:文件夹
- -:普通文件
- l:软链接(类似Windows的快捷方式)
- b:块设备文件(例如硬盘、光驱等)
- p:管道文件
- c:字符设备文件(例如屏幕等串口设备)
- s:套接口文件
各种文件的例子
虽然说 Linux 系统不以文件后缀来区分文件,但是这并不代表Linux 下的工具(如:gcc)可能会对文件后缀有要求。
刚才我们学习的一个字符是文件的类型,那么剩下的九个字符是文件的访问权限,那这是如何对应起来的呢?我们来学习一下。
2.基本权限
- 读(r/4): Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
- 写(w/2): Write 对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
- 执行(x/1): Execute 对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
- “-”表示不具有该项权限
剩下的九个字符三三为一组,第一组是拥有者的权限,第二组是所属组的权限,最后一组是其他人的权限。
如何描述文件的权限
以目录文件 dir 为例,dir 这个文件的拥有者是 Joy,所属组是 Joy。拥有者具有读权限、写权限和可执行权限,所属组具有读权限、写权限和可执行权限,其他人具有读权限、没有写权限和具有可执行权限。
文件权限值的表示方法
1.字符表示方法
2.8进制数值表示方法
文件访问权限的相关设置方法
如何操作权限呢?
操作文件的权限有两种:一是设置文件属性(chmod),而是设置文件所属角色(chown 或者 chgrp)。
注:当你是 root 用户或者是文件的拥有者时,才能更改文件的属性。
chmod
功能: 设置文件的访问权限
格式: chmod [参数] 权限 文件名
常用选项:
- R -> 递归修改目录文件的权限
- 说明:只有文件的拥有者和root才可以改变文件的权限
① 用户表示符+/-=权限字符
- +:向权限范围增加权限代号所表示的权限
- -:向权限范围取消权限代号所表示的权限
- =:向权限范围赋予权限代号所表示的权限
- 用户符号:
- u:拥有者
- g:拥有者同组用
- o:其它用户
- a:所有用户
chmod u-r 文件名 #去除文件拥有者对该文件的读权限
chmod u+x 文件名 #给文件拥有者加上对该文件的可执行权限
chmod u-rwx 文件名 #去除文件拥有者对该文件的所有权限
chmod u+rw 文件名 #给文件拥有者加上对该文件的读权限和写权限
chmod g-rw 文件名 #去除所属组对该文件的读权限和写权限
chmod g+rwx 文件名 #给所属组加上对该文件的所有权限
chmod o-rwx 文件名 #去除其他人对该文件的所有权限
chmod u-rwx,g-rwx 文件名 #去除拥有者和所属组对该文件的所有权限
chmod a+rwx 文件名 #给所有人加上对该文件的全部权限
chmod a=rwx 文件名 #给所有人加上度该文件的全部权限
有和没有普通文件权限的样子
为什么我是所属组,且所属组有对该文件的所有权限,我还是不能够对文件进行相关的操作呢?因为系统的角色匹配结构是 if-else if - else 结构,而不是 if-if-if 结构。只要前面的角色匹配上了,就只能拥有该角色对该文件的权限,无法拥有其他角色对该文件的权限。其实如果 Linux 系统采取 if-if-if 的匹配结构,你想去除拥有者的权限,那么你也要去除所属组所对应的权限。这样是不合理的,因为所属组可能还有有其他人。
root 用户不受任何权限的约束
sudo chown 用户名 文件名 #将指定文件的拥有者改为指定用户
sudo chgrp 用户名 文件名 #将指定文件的所属组改为指定用户
sudo chown 用户名1:用户名2 文件名 #将指定文件的拥有者和所属组改为指定用户
#-R 递归修改文件或目录的拥有者或所属组
注:修改文件的拥有者和所属组都需要使用 root 用户,也可以使用 sudo 指令暂时提权。
②三位8进制数字
文件相关指令
1.file指令
功能说明:辨识文件类型。
语法: file [选项] 文件或目录…
常用选项:
- -c 详细显示指令执行过程,便于排错或分析程序执行的情形
- -z 尝试去解读压缩文件的内容
2.umask指令
为什么要有权限呢?便于我们和系统进行安全管理!
那又为什么我们创建的目录或者普通文件,其默认权限是我们所看到的样子呢?
其实,Linux 规定了目录的起始权限是 777,而普通文件的起始权限是 666。除了起始权限,Linux 系统还有一个权限掩码,超级用户默认掩码值为0022,普通用
户默认为0002。(注:最开头的 0 不需要管,可以看做八进制数的标志)系统默认会配置好 umask 权限掩码。凡是在 umask 权限掩码中出现的权限,都必须在起始权限中去掉。
那去掉 umask 权限掩码中出现的权限是什么意思呢?是做减法吗?学习这个之前,我们先来学习一下 umask 指令的用法。
umask
功能: 查看或修改文件掩码
用法: umask 权限值
umask #查看权限掩码
umask 数字 #将权限掩码改为指定数字
那么现在我们来回答上面的问题:去掉是做减法吗?我们来看一下。
通过上图的推导,我们可以知道去掉并不是做减法,那么去掉究竟是什么意思呢?其实是通过位运算来达到去掉的目的。最终权限 = 起始权限 & (~mask)
那为什么这样子就能做到去掉权限掩码中出现的权限呢?因为默认 umask 权限掩码中的 1 表示要去掉的权限位,0 表示要保留的权限位。那么,~umask中的 1 表示要保留的权限位,0 表示要去掉的权限位。那么起始权限和 ~umask 按位与就能够做到去掉权限掩码中出现的权限了。
目录的权限
- 可执行权限: 如果目录没有可执行权限, 则无法 cd 到目录中
- 可读权限: 如果目录没有可读权限, 则无法用 ls 等命令查看目录中的文件内容
- 可写权限: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件
如果我们要进入一个目录,需要该目录的可执行权限。所以,系统就规定目录的起始权限是 777 。因为所有的目录被创建出来,一般都要能够被进入的。而大部分普通文件都是不可执行的,所以普通文件一般被创建出来都是没有可执行权限的。
粘滞位
Linux 系统中有很多用户,有时候用户需要在一个公共的目录下,进行临时文件的操作(增删查改)。那么系统也有这样的目录来满足用户的需求。
那为什么张三为什么不在李四的家目录下操作呢?因为没有权限。粘滞位是在一个公共的目录下,大家一起进行文件操作,其创建者是 root 用户。
那现在我们就自己手动创建一个公共目录吧!
张三和李四在公共目录下创建自己的文件。
李四不能没有张三创建的文件的写权限和可执行权限
李四没有张三创建的文件的任何权限,却可以删除张三的文件。
其他人对一个文件没有任何权限,却可以删除该文件,这样子合理吗?其实很合理,因为能不能删除一个文件并不取决于用户对该文件有没有权限,而是取决于用户对于该目录有没有读权限。
一个文件能不能被删除取决于目录权限,而公共目录对任何人都有读写执行权限。所以任何人都能删除其他人在公共目录下的文件。那这样是不是非常不合理?我在公共目录下创建的文件居然被你删掉了,那怎么行呢?
那我们怎么才能让大家在一个公共目录进行 rwx 操作,但禁止大家互删对方的文件呢?那么,这时候就需要给公共目录设置粘滞位(权限的一种特殊情况)。
注:粘滞位只能给目录进行设置。
chmod +t 目录名 #给公共目录设置粘滞位
设置完粘滞位后,我们再来看看李四能不能删除张三的文件了。
通过上图,我们可以看到:给公共目录设置好粘滞位后,用户无法删除别的用户的文件,只能删除自己的文件。
当一个目录被设置为"粘滞位"(chmod +t),则该目录下的文件只能由
- 超级管理员删除
- 该目录的所有者删除
- 该文件的所有者删除
👉总结👈
本篇博客主要讲解了shell 命令及其运行原来、权限的概念、权限管理、文件相关指令以及粘滞位等等。那么以上就是本篇博客的全部内容了,如果大家觉得有收获的话,可以点个三连支持一下!谢谢大家!💖💝❣️