我们平时在使用Windows的图形化界面或者在Linux下进行敲命令,是在直接使用操作系统吗? ----- 并不是
首先我们知道对于计算机的体系结构是这样的:
操作系统:管理好下层软件,并且给上层使用者提供良好的执行环境
操作系统的功能是很复杂的,所以如果让人直接访问使用操作系统,是不合适的。
原因:
就比如
银行直接让所有人存取钱的时候自己操作所有的过程,银行的金库也是暴露在所有人面前的。这时候首先人需要会操作银行的机器,并且如果有人有坏想法,想把金库中的钱转到自己账户会带来十分大的安全因素。
所以,基于以上原因,系统的设置者并不会让人直接操作 操作系统
既然我们平时在使用Windows图形界面和在Linux下敲击各种命令都不是直接使用操作系统,那么我们是如何与操作系统进行交互的呢?
Windows下:通过图形接口,点击,从而完成我们的
操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)
Linux下:敲出某个指令,然后返回结果(如敲出ls,则显示出目录下的文件)
其实,用户访问操作系统是通过一个“间接人”的方式来访问操作系统的。就相当于一个“媒婆”。而这个媒婆就是外壳程序,Windows图形界面和Linux的命令操作其实就是操作系统提供的外壳程序。
Linux实际上就是一个操作系统,我们叫做"kernel", 一般用户不可以直接使用kernel,而是通过“kernel”的外壳程序,也就是shell来与kernel沟通。
shell的简单定义:命令行解释器
- 将使用者的命令翻译给核心 (kernel) 处理
- 同时,将核心的处理结果翻译给使用者
外壳程序存在的意义是什么呢?
其实外壳程序并不是自己去和操作系统交互,而是派生子进程去进行交互
所以其实 计算机的体系结构是这样的:
echo $BASH
结果:/usr/bin/bash
这其实就是一个文件
bash就是CentOs中的shell外壳程序。shell就是对外壳程序的统称
shell就相当于媒婆这个职业,bash就是某个媒婆,如王婆
root
:超级用户,只有一个。具有Linux下最高权限,无权限限制(管理员)
普通用户
:普通用户可以有多个,并且受权限的限制
root用户的命令提示符为 #
普通用户的命令提示符为$
Linux 下可以同时存在多个用户,所以Linux是一个多用户的操作系统
两种写法:
su username
su - username
两种写法的区别:
-
选项 它代表切换用户身份时,用户的环境变量以及工作目录也要切换成新用户的环境变量和工作目录。环境变量是用来定义用户的操作环境的,如果环境变量没有随用户身份切换,那么很多操作将无法正确执行。
root切换为普通用户
su username
或者 su - username
普通用户切换为root用户
su
或su -
或su root
或su - root
普通用户切换为普通用户
su username
或 su - username
注意
其实root和普通用户就是Linux下真正存在的账号
权限是什么:
我们可以说,我对这个文件具有读的权限
但是如果这个文件如果本身就不可读,那么即使我们的权利很大也没有对这个文件的读的权限,因为这个文件本身就没有读的属性。
有两个方面
即权限的核心 = 人 + 事物属性
ll
命令,可以查看文件的各个属性
其中,ll
显示的第一列的第一个字符表示 改文件的文件类型
补充:Linux下不以文件后缀来区分文件类型
只要你是一个可执行文件(.out文件),即使把后缀改为.txt
也可以执行,或者把后缀改为无 也可以执行
而Linux下就根据 上图中的第一列 区分文件类型
常见文件类型:
d
:表示目录文件
-
:表示普通文件
p
:表示管道文件
b
:表示块设备,如磁盘设备
c
:表示字符设备,如键盘或者显示器
查看字符设备:第一个字符以c开头
l
:表示链接文件:类似于 Windows中的快捷方式
如图中就是建立了一个链接文件a.link指向可执行程序a
不过 此时文件中并没有创建a 这个可执行文件,所以就是红色
关于文件类型可以通过ll
查看第一列来查看
注意
Linux下 不以文件后缀来区分文件类型, 不代表不可以使用,因为后缀名在系统层面没意义,但是对用户有用,可以方便用户区分文件类型。
只是Linux系统下不以文件后缀来区分文件类型,但是在别的环境下不是这样的!
比如用gcc编译某个写好的.c文件,如果改为.txt是不可以被识别的,这是因为gcc是Linux下的一个软件,gcc != Linux系统
文件的权限有两方面:人 和 文件的本身属性,文件访问者就是所谓的人,也就是访问者有什么权利
文件的拥有者、所属组、other是一种角色(身份),每个用户都可能是其中的一个身份,用户就是具体的人
文件属性中的文件权限部分:
每一个文件,都有三个身份的权限表示
每一个身份,有三个位 表示其权限都有什么
顺序固定:第一个位置为r权限
,第二个位置为w权限
,第三个位置为x权限
其中 r
表示读权限,w
表示写权限,x
表示执行权限,-
表示无该权限
如果有该权限,对应位置就写上该权限的缩写r/w/x
如果没有,就用-
表示该位置的权限情况
以上图为例 :
rwx
,表示文件的所有者具有 读权限、写权限、执行权限r-x
,表示文件的所属组具有读权限、执行权限,没有写权限r-x
,表示other具有读权限、执行权限,没有写权限如何表述一个文件的权限?
根据文件的权限的表示行
该文件的拥有者具有 xxx xxx 没有xxx
该文件的所属组具有 xxx xxx 没有 xxx
该other 具有 xxx xxx 没有xxx
1.字符表示方法
字符表示方法就是 我们利用ll
显示出来的那样的权限表示
2 .八进制数值表示方法
因为
权限的顺序是固定的:r w x
每一个位置 要么就是有该权限,要么就是没有该权限(只有两种状态)
所以我们可以用 1 表示该位置有该权限,0 表示该位置没有该权限,这样就可以利用三个二进制数 表示某个身份的权限了
而 3个二进制数 可以转化为一个8进制数,所以就可以利用9个二进制数,也就是3个八进制数表示 一个文件三个身份的权限都有什么
举个例子,如果某一个文件的权限是rwx r-x r-x
那么用二进制表示权限:111 101 101
八进制表示权限:7 5 5
chomd [参数] 权限 文件名
对应文件权限的表示方法,文件权限的修改也有两种方法
1️⃣ 字符修改:ugo 与 + -
权限更改
+
::向权限范围增加权限代号所表示的权限-
:向权限范围取消权限代号所表示的权限=
:向权限范围赋予权限代号所表示的权限用户符号
u
:拥有者g
:所属组o
:其他用户(other)a
:所有用户#给单身份添加单个权限
给拥有者 添加执行权限:
chmod u+x test.c
给所属组去掉读权限:
chmod g-x test.c
#给单身份添加多个权限
给拥有者 去掉读写权限:
chmod u-rw test.c
给other去掉所有权限:
chmod o-rwx test.c
给拥有者添加所有权限
chmod u+rwx test.c
#给多个身份修改单个权限
给拥有者 添加读权限,去掉执行权限:
chmod u+r,u-x test.c
给拥有者去掉读权限,所属组添加写权限
chmod u-r,g+w test.c
#给多个身份修改多个权限
拥有者去掉写和执行,所属组去掉执行,other添加读和执行
chmod u-wx,g-x,o+rx test.c
#给所有身份修改权限
给所有人去掉读权限
chmod a-r test.c
2️⃣八进制数字修改:3个八进制数字的组合
每一个身份具有三个权限,三个权限中每一个权限都有 0 和 1两个状态,0表示无此权限,1表示有此权限。三个二进制数字组成一个特定的八进制数,表示一个身份的权限情况
一共有三个身份,所以只需要有三个八进制数 就可以设置所有身份的权限了
如rwx rwx r--
对应 111 111 100
对应 774
#给所有人 所有权限
chmod 777 test.c
#去掉所有人的所有权限
chmod 000 test.c
#给所有人只设置读权限
顺序是 r w x ,只有读权限对应: 100
即八进制 4
每个人都只有读,所以每个身份的权限值都是 4
chmod 444 test.c
#拥有者读写,所属组只有读,其他人无权限
chmod 640 test.c
没有权限会带来什么问题?
如图所示:
注意 root不受权限控制 即使没有权限 也可以进行操作
root作为other 甚至可以把人家的文件的权限给改了
注意:
需要在root下操作(强制命令),或者在执行的命令前面加
sudo
,否则需要输入对方的密码 并且系统也可能不会同意此操作
sudo
:执行后续命令,要以root的权限来执行但是
sudo
命令,需要该普通用户在新人列表里面才可以执行,添加用户到新人列表是需要root身份的(下一篇解释)
1️⃣更改文件的拥有者
chown 指定拥有者 文件名
2️⃣更改文件的所属组
chgrp 指定所属组 文件名
3️⃣组合修改
chown 指定拥有者:指定所属组 文件名
注意问题
为什么没有修改为other
other并不具体
修改了拥有者和所属组,不属于这两个的就是other
如果拥有者也是所属组,删除了拥有者的所有权利,那么还可以作为所属组的身份对文件进行访问/修改/执行 吗
Linux下文件的权限只会被认证一次
即:首先判定你是谁,如果你是拥有者,那么只看拥有者权限,和你是否是所属组没关系。如果不是拥有者而是所属组,那么只看你的所属组权限
面试问题:进入一个目录属于什么权限?
相信很多人都会认为是 读权限
其实并不是
对于目录来说
所以mkdir
创建目录的时候,默认的权限就会有 读权限、写权限、执行权限等
mkdir dir1
创建一个目录,权限并不是 rwx rwx rwx
而是rwx rwx r-x
touch file1
创建一个文件,权限是rw- rw- r--
why?
为什么创建出的文件或目录的权限不是从 777
或000
开始
而是从其中间的某种状态开始呢?
Linux默认:
一个目录被创建,起始权限是从777
开始的
一个普通文件被创建,起始权限是从666
开始的
(少了可执行,因为普通文件有各种文件类型,有些是不可执行的,如果某个文件可执行,后续自己加权限即可)
现象:
775
664
这是为什么呢?
其实,最终权限的确定 是和 一个掩码有关的
这个掩码就是umask
,叫做权限掩码
凡是在umask中出现的权限,都不应该在最终权限中出现
注意:umask
为4位数字,只关注umask
的后三位即可,第一位其他权限位有关。如umask为0002
,我们认为是002
即可
查看umask
umask
所以 起始权限 与 umask 做怎样的运算才能得到 最终权限呢?
既然umask中出现的权限,都不应该出现在最终权限中,这就意味着umask与起始权限经过某种运算之后,保留起始权限中没有在umask中出现的权限
所以应该是起始权限 与 取反后的umask 做与运算
解释:
如果umask中某个位置为0,也就是umask中没有这个权限,那么取反后就是1,与起始权限做与运算就可以保留下来umask中没出现的权限
如果umask中某个位置是1,也就是umask中有这个权限,那么取反后就是0,与起始权限做与运算就可以去掉这个在umask中出现的权限
umask=002 二进制:000 000 010
#目录的最终权限:775 起始权限 777
777: 111 111 111
~002: 111 111 101
结果:111 111 101 即775
#普通文件的最终权限:664 起始权限 666
666: 110 110 110
~002: 111 111 101
结果:110 110 100 即664
经验证是正确的
结论:最终权限
=起始权限 & (~umask)
如果想让最终权限不按照系统的来,那么可以自己设置umask
umask 0xxx
:xxx是设置的umask值
举个例子
如果设置为umask 0777
这样得到的文件的最终权限 一定是000
也就是什么权限都没有
存在问题
一个用户如果有目录的写权限,那么该用户就可以对目录中的文件进行删除/修改,即使用户没有对改文件的写权限。
也就是说,我写的文件,凭什么你可以随便删?
验证一下:
由上图可知,即使是root创建的文件,普通用户也可以删除
所以,这个机制似乎太不合理了,有了目录的写权限就可以随便删除别人的文件!
并且即使你把rootfile.txt
的权限全部删除,虽然不可以读,但是同样可以删除。
也就是说:我不可以读也不可以写,但是我可以删!
当然,正常情况下不同的用户有各自的工作目录,一个用户的工作目录只有自己有读、写、执行权限,所属组以及other都是没有任何权限的。所以other连你的工作目录进都进不去,其实是很安全的!如图:
但是,不排除有特殊情况:所以如果所有的用户在一个工作目录下,那么岂不乱套了!
就比如根目录下的tmp目录:/tmp
其实这个tmp
目录就是存放所有目录临时文件的目录
为了解决这个不合理的问题,Linux下就引入了粘滞位的概念
也就是说,如果所有人在同一个目录下工作,默认是每个用户对目录下的所有文件都有删除/修改的权限,如何让所有用户只能删除/修改自己的文件呢?
(粘滞位是针对other的)
chmod O+t 目录名
:添加粘滞位
chomd o-t 目录名
:去掉粘滞位
这时候,目录的权限就变成了下图:
此时对于other,权限变成了rwt
,t就相当于是一种x的特殊情况,虽然其他人可以进入目录但是只能删除自己的文件,不能删除其他人的。
注意
1. 粘滞位只能给目录设置
2. 一般是谁设置粘滞位,谁才能取消(root不受限制)
如果一个目录被设置为"粘滞位",则该目录下的文件只能由以下成员删除:
此篇文章结束~ 感谢阅读~❤️❤️❤️