【我在异世界学Linux】Shell外壳程序以及权限的理解(粘滞位、umask)
文章目录
- shell外壳程序
- 用户为什么不是直接使用操作系统
- 用户如何访问的操作系统
- Shell外壳程序是什么
- 外壳程序存在的意义
- 查看当前使用的shell外壳程序
- 权限
- Linux下的用户
- 用户切换
- 权限是什么?
- Linux权限管理
- 查看文件属性
- 文件访问者的分类(人属性)
- 文件类型和访问权限(事物属性)
- 文件权限值的表示方法
- 对文件权限的修改(两种方法)
- 对文件拥有者和所属组的修改
- 常见权限问题
- 目录权限
- umask
- 设置umask
- 粘滞位
shell外壳程序
用户为什么不是直接使用操作系统
我们平时在使用Windows的图形化界面或者在Linux下进行敲命令,是在直接使用操作系统吗? ----- 并不是
首先我们知道对于计算机的体系结构是这样的:
操作系统:管理好下层软件,并且给上层使用者提供良好的执行环境
操作系统的功能是很复杂的,所以如果让人直接访问使用操作系统,是不合适的。
原因:
- 对用户是不友好的,因为用户是不善于直接使用操作系统,用户需要对操作系统很熟悉才可以使用的得当。
- 如果让人直接访问操作系统:
- 操作成本高(需要学这,学那才可以使用)
- 当用户犯错的时候,会带来不安全的因素(操作系统崩了,整个计算机也就崩了)
就比如
银行直接让所有人存取钱的时候自己操作所有的过程,银行的金库也是暴露在所有人面前的。这时候首先人需要会操作银行的机器,并且如果有人有坏想法,想把金库中的钱转到自己账户会带来十分大的安全因素。
所以,基于以上原因,系统的设置者并不会让人直接操作 操作系统
用户如何访问的操作系统
既然我们平时在使用Windows图形界面和在Linux下敲击各种命令都不是直接使用操作系统,那么我们是如何与操作系统进行交互的呢?
Windows下:通过图形接口,点击,从而完成我们的
操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)
Linux下:敲出某个指令,然后返回结果(如敲出ls,则显示出目录下的文件)
其实,用户访问操作系统是通过一个“间接人”的方式来访问操作系统的。就相当于一个“媒婆”。而这个媒婆就是外壳程序,Windows图形界面和Linux的命令操作其实就是操作系统提供的外壳程序。
Shell外壳程序是什么
Linux实际上就是一个操作系统,我们叫做"kernel", 一般用户不可以直接使用kernel,而是通过“kernel”的外壳程序,也就是shell来与kernel沟通。
shell的简单定义:命令行解释器
- 将使用者的命令翻译给核心 (kernel) 处理
- 同时,将核心的处理结果翻译给使用者
外壳程序存在的意义
外壳程序存在的意义是什么呢?
- 是用户和操作系统交互的中间软件层
- 在一定程度上起到保护操作系统的作用,拒绝用户的一些非法或者不合理的请求
其实外壳程序并不是自己去和操作系统交互,而是派生子进程去进行交互
所以其实 计算机的体系结构是这样的:
查看当前使用的shell外壳程序
echo $BASH
结果:/usr/bin/bash
这其实就是一个文件
bash就是CentOs中的shell外壳程序。shell就是对外壳程序的统称
shell就相当于媒婆这个职业,bash就是某个媒婆,如王婆
权限
Linux下的用户
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 用户,都需要知晓对方的密码,只有正确输入密码,才能实现切换
- 从 root 用户切换至其他用户,无需知晓对方密码,直接可切换成功。
其实root和普通用户就是Linux下真正存在的账号
权限是什么?
权限是什么:
我们可以说,我对这个文件具有读的权限
但是如果这个文件如果本身就不可读,那么即使我们的权利很大也没有对这个文件的读的权限,因为这个文件本身就没有读的属性。
有两个方面
- 事物本身具有的属性
- 人是否有权利去做
即权限的核心 = 人 + 事物属性
Linux权限管理
查看文件属性
ll
命令,可以查看文件的各个属性
其中,ll
显示的第一列的第一个字符表示 改文件的文件类型
补充:Linux下不以文件后缀来区分文件类型
只要你是一个可执行文件(.out文件),即使把后缀改为.txt
也可以执行,或者把后缀改为无 也可以执行
而Linux下就根据 上图中的第一列 区分文件类型
常见文件类型:
d
:表示目录文件
-
:表示普通文件
p
:表示管道文件
b
:表示块设备,如磁盘设备
查看块设备:第一个字符以b开头
c
:表示字符设备,如键盘或者显示器
查看字符设备:第一个字符以c开头
l
:表示链接文件:类似于 Windows中的快捷方式
如图中就是建立了一个链接文件a.link指向可执行程序a
不过 此时文件中并没有创建a 这个可执行文件,所以就是红色
关于文件类型可以通过ll
查看第一列来查看
注意
Linux下 不以文件后缀来区分文件类型, 不代表不可以使用,因为后缀名在系统层面没意义,但是对用户有用,可以方便用户区分文件类型。
只是Linux系统下不以文件后缀来区分文件类型,但是在别的环境下不是这样的!
比如用gcc编译某个写好的.c文件,如果改为.txt是不可以被识别的,这是因为gcc是Linux下的一个软件,gcc != Linux系统
文件访问者的分类(人属性)
文件的权限有两方面:人 和 文件的本身属性,文件访问者就是所谓的人,也就是访问者有什么权利
- 文件的拥有者:文件属于谁
- 文件的所属组:文件属于哪一个组
- other:不属于上面两种的任何一个,就是other
- 关于拥有者,一般就是文件的创建者
- 关于所属组,比如你在开发小组A里面工作,你敲了一份代码叫test.cpp,该文件的拥有者是你,如果Linux的权限只有拥有者和other,那么当小组A的组长(你的上司)想看代码的时候,他也属于other,如果想让组长看,必须让文件对other也公开,这样就让你的竞争对手看到了。所以需要所属组这个权限
- 关于other,Linux不会标记,只要不是拥有者和所属组就是other
文件的拥有者、所属组、other是一种角色(身份),每个用户都可能是其中的一个身份,用户就是具体的人
文件类型和访问权限(事物属性)
文件属性中的文件权限部分:
每一个文件,都有三个身份的权限表示
每一个身份,有三个位 表示其权限都有什么
顺序固定:第一个位置为r权限
,第二个位置为w权限
,第三个位置为x权限
其中 r
表示读权限,w
表示写权限,x
表示执行权限,-
表示无该权限
如果有该权限,对应位置就写上该权限的缩写r/w/x
如果没有,就用-
表示该位置的权限情况
以上图为例 :
- 拥有者为
rwx
,表示文件的所有者具有 读权限、写权限、执行权限 - 所属组为
r-x
,表示文件的所属组具有读权限、执行权限,没有写权限 - other为
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下文件的权限只会被认证一次
即:首先判定你是谁,如果你是拥有者,那么只看拥有者权限,和你是否是所属组没关系。如果不是拥有者而是所属组,那么只看你的所属组权限
常见权限问题
目录权限
面试问题:进入一个目录属于什么权限?
相信很多人都会认为是 读权限
其实并不是
对于目录来说
- 执行权限:进入目录
- 可读权限:查看目录中的文件内容(如ls等命令)
- 可写权限:在目录中创建 / 删除 / 修改 文件或目录
所以mkdir
创建目录的时候,默认的权限就会有 读权限、写权限、执行权限等
umask
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 起始权限 777777: 111 111 111
~002: 111 111 101结果:111 111 101 即775#普通文件的最终权限:664 起始权限 666666: 110 110 110
~002: 111 111 101结果:110 110 100 即664经验证是正确的
结论:最终权限
=起始权限 & (~umask)
设置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不受限制)
如果一个目录被设置为"粘滞位",则该目录下的文件只能由以下成员删除:
- 超级管理员
- 该目录的所有者
- 该文件的所有者
此篇文章结束~ 感谢阅读~❤️❤️❤️
【我在异世界学Linux】Shell外壳程序以及权限的理解(粘滞位、umask)相关推荐
- Linux中相关知识(atexit(),fork(),粘滞位)
1.atexit()函数 函数名: atexit 头文件:#include<stdlib.h> 功 能: 注册终止函数(即main执行结束后调用的函数) 用 法: int atexit(v ...
- Linux入门:权限管理之粘滞位
关于linux下粘滞位(sticky位): 粘滞位(Sticky bit): 如果用户对目录有写权限,则可以删除其中的文件和子目录,即使该用户不是这些文件的所有者,而且也没有读或写许可.粘滞位出现可执 ...
- 【Linux】权限管理 _目录权限 _umask _粘滞位[学习总结 _复习专用]
1.Linux权限的概念 Linux下有两种用户:root.普通用户. root:可以在Linux系统下做任何事情,不受权限的限制 普通用户:在Linux下做有限的事情 root用户的命令提示符是&q ...
- 【我在异世界学Linux】认识操作系统 | 理解管理 | 系统调用(System Call)
文章目录 什么是操作系统 是什么 为什么要设计操作系统? 操作系统是怎么进行管理的 系统调用和库函数 | 理解操作系统内部 什么是操作系统 是什么 每个计算机系统都包含一个基本的程序集合,称之为操作系 ...
- 【我在异世界学Linux】认识冯诺依曼体系结构
文章目录 一.冯诺依曼体系结构是什么 二.冯诺依曼为什么要这么设计? 三.内存是怎么提高效率的呢? 解释:程序要运行,必须加载到内存 四.和QQ好友聊天的时候,数据是怎么流向的? 一.冯诺依曼体系结构 ...
- 【看表情包学Linux】shell 命令及运行原理 | Linux 权限 | 文件权限的修改和转让 | 目录的权限 | Sticky bit 粘滞位
- Linux学习笔记3—Linux权限的初步认识(rwx、sudo、粘滞位、umask)
文章目录 shell命令以及运行原理 如何开启当前用户的sudo命令 Linux权限管理 1 Linux用户类别 2 Linux的文件权限的理解 3 Linux文件权限的修改 I chmod-修改拥有 ...
- 初识linux之shell外壳与基本权限
目录 一.shell 1.出现原因 2.作用 3.windows与linux的shell (1)windows (2)linux 4.存在意义 (1)便于用户与操作系统之间的沟通 (2)保护操作系统 ...
- 【Linux】Linux权限管理 —— shell运行原理 | 权限 | 目录权限 | 粘滞位 | 权限掩码umask
Linux权限及相关指令 1. shell命令以及运行原理 2. Linux权限管理 2.1 权限相关概念 2.1.1 用户分类 2.1.2 如何用户切换 2.2 权限的两要素 2.2.1 人 2.2 ...
最新文章
- nodejs高版本转低版本
- JavaScript中的call、apply、bind深入理解
- PAT甲级1145 Hashing - Average Search Time:[C++题解]哈希表、哈希表开放寻址法、二次探测法、求平均查找次数
- 二叉树外部节点_leetcode 102 二叉树的层序遍历1 /BFS
- 小程序-demo:小程序示例-page/component
- Web数据存储之localStorage和sessionStorage
- 我使用 html 反向输出自己打自己(7)
- 阿里P8架构师谈:架构设计经验汇总
- 如何在 go 中实现一个 worker-pool?
- git最简单直接粗爆与github教程
- css 六角形_创建数字六角形瓷砖图(第1部分)
- 区块链开发区块链架构与应用PPT
- 打印机扫描无法连接到计算机名,网络打印机无法扫描到电脑怎么处理
- 无线路由器桥接、中继、电力猫组网方法分享
- 【[SDOI2008]山贼集团】
- android音乐播放器的历史,基于Android音乐播放器的研究
- 八爪鱼采集教程——房源信息采集
- matlab 读取 通达信,Matlab 自动导入通达信板块文件
- TCP/IP实现(九) 插口I/O
- python实现名片管理系统(界面+数据库)