正文开始@小边小边不秃头
1. shell命令以及运行原理
Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们普通用户,无法直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel?这是因为内核使用成本高,且有权限约束问题。
从技术角度,Shell的最简单定义 —— :yellow_heart: 命令行解释器(command Interpreter)主要包含:
- [ ] 将使用者的命令翻译给核心(kernel)处理。
- [ ] 同时,将核心的处理结果翻译给使用者。
下面我们通过一个故事感性认识一下shell
part one 苦情男初表心意
如果说你是一个闷骚且害羞的程序员,那shell就像媒婆,操作系统内核就是你们村头漂亮的心动女嘉宾小花。
你看上了小花,但是又不好意思直接表白,就让你家人(你爸是村长)找媒婆帮你提亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给小花。:yellow_heart: shell 可以传递请求命令,让OS执行命令
" title="">
可是小花根本就不喜欢你,给你发了张好人卡,说啊,这小伙子人挺好,就是不是我的type,而且我已经有男嘉宾了。
这就相当于 ——
" title="">
part two 梅开二度
可是呢,你还是很喜欢小花,觉得啊,那男生哪有我有魅力?!于是你又去找媒婆。但是对于非法请求,媒婆是有权利拒绝的,这时媒婆让您滚。
" title="">
这其实就是保护了小花,让她免受打扰。:yellow_heart: shell可以保护内核。
part three 死缠烂打
可是呢,你真是太喜欢小花了,你虽然是理工男,但这幻想中的乐观,是你内向的浪漫(我去!我边通书写小说去得了),你说,我欲与君相知,长命无绝衰。山无棱,江水为竭,冬雷震震,夏雨雪,天地合,乃敢与君绝!(小边借博文默默提升你们表白水准呢啊!)媒婆碍于你爸是村长的态势,勉强答应,把事情交给实习生做,反正做不好也不关我媒婆的事儿。
" title="">
男生不要死缠烂打哦,真的特丢人,你以为只有你们两个人知道的事很可能她的闺蜜室友同学辅导员全都知道了哈哈(我可没夸张呢,工大女生八卦属性不变呢)。
而我们找到媒婆姓王,所以我们叫它王婆,它对应我们常使用的bash。
" title="">
:yellow_heart: 显示系统内所有进程
ps axj | grep bash
2. Linux权限管理
2.1 权限相关概念
2.1.1 用户分类
:green_heart: 1. 超级用户(root) —— 具有非常高的权限
:green_heart: 2. 普通用户 —— 权限受约束
注:这两套密码绝对要不一样,否则会产生权限界限不清的状况
2.1.2 如何用户切换
:yellow_heart: 1. 普通用户切换为root
su -
" title="">
或者
su
它们的区别在于切回来su -
会变成家路径再往下切会比较麻烦,而su
还是当前路径。
" title="">
:yellow_heart: 2. root切换为普通用户
su - bts 以bts为例
" title="">
说明root可以变成任何人,且不需要输密码。root权限真的很大,一定要保管好它的密码,并且尽量设的复杂。
:yellow_heart: 注意,关于回退。此时我们想从bts再切回root,直接exit
或者[ctrl + d]。
" title="">
不建议su -
,因为这样会重新创建bash ——
" title="">
2.2 权限的两要素
什么是权限?即一件事情,是否允许被特定的人做。比如校长办公室是可以进的,但是一般情况下你不能进,但是呢如果你到夏季小学期到行政楼门口光膀子打地铺你就会被请进去喝茶水;面包能吃,但是毛概书不能吃,所以你可以吃面包,不能吃毛概书。这里都包含了两个要素。
:yellow_heart:那放到这里,权限约束的是人,文件本身具有天然的权限属性(读r写w执行x)。即,权限 = 人 + 事物。
下面的有关权限的操作将围绕着两个基本点展开。
:purple_heart:我们基本操作指令中,ll
或ls -l
可以显示文件更多属性,这些属性是什么呢?
" title="">
来吧!
2.2.1 人
:yellow_heart: Linux下的用户类别
- 拥有者(owner)
- 所属组(group)
- 其他人(other)
上文所提到的用户分类于此并不矛盾,超级用户和普通用户是具体的人,而拥有者所需组其他人,是他们扮演的角色。
" title="">
我们不需要单独的other列表,因为有了拥有者和所属组,其他人自然就被排除在外了。
注:这里所属组的存在是有它的意义的,比如一个部门有两个项目组在竞争性完成一个项目,我写的绝妙代码,我想让自己能看见,同组人能看见,别人看不见。
" title="">
2.2.2 事物属性
" title="">
:yellow_heart: 1. 属性第一列 —— 标识文件类型
在Linux系统中,不以文件后缀区分文件类型,也就是说文件类型与后缀没有直接关系。
Linux下一切皆文件,文件类型 ——
d 目录文件
- 普通文件(各种动静态库,可执行程序,源程序)
—————————————————下面只做了解————————————————————————
l 软链接link(类似Windows的快捷方式)
b 块设备文件bar(例如硬盘、光驱等)
p 管道文件pile
c 字符设备文件(例如键盘显示器等串口设备)[后序会站在系统角度重新理解]
s 套接口文件
:yellow_heart: 2. 接下来的9个字符
三三为一组,分别对应拥有者、所属组、其他人;三个字母分别对应文件属性,读r、写w、执行x。每个字母都具有两态概念,即是否其具有读权限、是否具有写权限、是否具有可执行权限。
描述下面这个文件权限,即是对于owner可读可写可执行,对于所属组可读可写可执行,对于其他人可读不可写可执行。
-rwxrwxr-x 1 bts bts 8360 Jan 24 17:25 a.out
3. 权限相关指令
3.1 文件的权限
:purple_heart:在此之前我们先来说明su -
和sudo
的区别
:yellow_heart: 1. 身份直接变为root
su - 或 su
:yellow_heart: 2. 临时权限提升,执行后续命令,以root身份执行
sudo touch root.txt
sudo是Linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。这样不仅减少了root用户的登录和管理时间,同样也提高了安全性。
注:因为我还没配置,所以暂时不能用sudo,在下一篇文章vim中,我会更新这里。在此暂时直接切回root身份演示,配置好之后快速上手sudo
即可。
" title="">
3.1.1 修改读写执行属性
3.1.1.1 chmod指令
:yellow_heart: 修改文件读写执行权限
chmod u+w file.c
即
chmod 用户表示符+/-权限字符 文件名
用户表示符
u 拥有者
g 所属组,拥有着同组人
o 其他人
a 所有用户
我们可以更改一个人的一个权限、
" title="">
一个人的多个权限、
" title="">
多个人的一个权限、多个人的多个权限,也可以批量化更改多个文件。
" title="">
注:修改不是自己的文件需要sudo
临时权限提升或者直接切成root身份。
sodu chmod 用户表示符+/-权限字符 文件名
接下来我们探索两个小问题 ——
:blue_heart: 1. 普通文件被约束权限的状况
" title="">
:blue_heart: 2. root受到权限约束吗?
- [ ] root 竟然不经过我bts的允许,直接把读写权限都干掉了,修改了我的权限属性。
- [ ] 此时root作为这个文件的other,即便不具有读写属性,却竟然还能读和写。
" title="">
但对于执行照样受约束,这是因为一些可执行程序的权限需要被强约束起来
" title="">
:yellow_heart:结论:root这个人几乎不受权限约束,权限是用来约束普通人的。
3.1.2 修改所有者所属组
3.1.2.1 chown指令
:yellow_heart: 更改文件拥有者
chown [参数] newUser filename
更改是需要得到别人的允许的,一般直接更改是不行的。
" title="">
这是符合常理的,现实中你给别人东西也是要经过别人同意的。比如说你表白一姑娘送给她一只熊:bear:,她完全可以不收啊,虽然你白买了很伤心,但是教你一招,可以假装要系鞋带,跟她说你帮我拿一下,然后你转头就跑,真聪明,哎。哈哈扯远了回来~
:purple_heart: 这时我们可以sodu
进行临时的权限提升或者直接切成root身份
sudo chown root file.txt 或 su
目前我直接切回root身份
" title="">
可以看到切到root身份/临时提升为root,也不需要什么别人的允许,就可以kind of为所欲为了
" title="">
3.1.2.2 chgrp指令
:yellow_heart: 更改文件或目录所属组
sudo chgrp newGrp filename
或直接切换为root身份 ——
" title="">
也可以带选项递归修改目录所属组
sudo -R chgrp newGrp filename
我自己都验了哈,结果不贴了。
:yellow_heart: 可以带选项同时更改拥有者所属组
sudo chown -R newUser:newGrp filename
或者直接切换为root身份 ——
" title="">
3.2 目录的权限
3.2.1 目录权限(重要)
- [ ] 可读权限:如果目录没有可读权限,无法用
ls
相关命令查看目录 - [ ] 可写权限:如果目录没有可写权限,无法在目录中创建文件/删除文件(这是因为在目录下创建新目录/文件,本质都是在路径树中,新增路径/节点)
" title="">
这都是显而易见的,那么进入目录需要什么权限?【面试题】
- [ ] 可执行权限:如果没有可执行权限,则无法
cd
到目录中
" title="">
比较有趣的是当这个目录可读可写不可进入时,此时查看目录,你确实能看到但最多也就是看看文件名,其它属性都是乱码。这是可以理解的,你要查看详细属性,要先进入目录。
" title="">
3.2.2 粘滞位(重要)
3.2.2.1 引入
我们建立了一个目录test,并把权限设置为完全公开。
" title="">
在其中touch了几个拥有者为root的文件,并把权限设置为对other不可写不可读。
" title="">
现在我以普通用户bts的身份,对于上述文件我属于other其他人。这些文件呢,你能看到,你不想让我看,我呢,确实也看不到。那好嘞,您也别看了,我给你干掉!
我竟然就真的干掉了!!
这是因为你目录本身就是对我bts就是可写的,我可以删自己的也可以删别人的。如果我们去掉目录的写[w]权限,那就确实删不掉了 ——
" title="">
:yellow_heart:以上我们可以看到,如果目录本身对other有写[w]权限,other可以删掉任何目录下的文件;反之,如果目录本身对other没有写[w]权限,other不能删掉任何文件。这并不科学。
3.2.2.2 粘滞位
:purple_heart: 现在我有这样的需求,其他人other可以在特定的目录下创建文件(有写权限),并写入(文件本身属性);但是不想让任何人删除我的文件(没有写权限),这本身是矛盾的。这就需要引入了粘滞位。【面试题】
chmod o+t dir
" title="">
这就保证了别人可以在这个目录下创建文件;可以删,但是只能删自己的,不能删别人的。
" title="">
注:
:yellow_heart: 1. 粘滞位只能对目录设置(一般是对other)
:yellow_heart: 2. 对于设置了粘滞位的目录,只有文件的拥有者或root可以删除,其他人不能删除。
:green_heart: 这样的场景是存在的,Linux下就有这样一个目录用于存储临时文件
" title="">
有时,有多个人或者系统会有很多的临时数据,所有的临时文件都放在系统的/tmp目录下。所有的权限需要放开,但是只想让文件的拥有者删除自己的文件,这需要设置粘滞位。
3.3 默认权限
3.3.1 文件权限值八进制方案
上文提到,每一个权限位都是确定的且是两态概念。因此我们可以采用八进制方案来表述权限
" title="">
我们就可以这样修改文件读写执行相关属性了 ——
" title="">
3.3.2 权限掩码
思考:为什么系统中的文件,创建出来的默认权限是这样?
默认权限 = 起始权限 + 权限掩码
:yellow_heart: 1. 起始权限
- [ ] 普通文件
666
- [ ] 目录文件
777
这样的起始值,是有一定道理的。
:yellow_heart: 2. 权限掩码
但是你创建的文件和目录,看到的权限往往不是上面的这个值,这是因为还受到权限掩码的影响。
所谓掩码umask,即掩码中为1的位,都应该在起始权限中去掉。
超级用户默认掩码值为0022
(第一个0表示八进制),即000 010 010
;普通用户默认掩码值为0002
,即000 000 010
.
于是 ——
rw-rw-rw- 666
110110110 initial 起始权限
000000010 umask 权限掩码
————————————————————————————
110110100 default 默认权限
rw-rw-r-- 664
可以总结出这样的运算公式
default = default & (~umask)
在八进制中直接对应位做减法可快速计算。
也可以自定义权限掩码 ——
umask 0333 对所有人只保留写权限
" title="">
订制的权限只在本次登陆有效。要想全局有效,要改配置文件,但是您不要改。
持续更新@边通书