终端同居物语:Shell咏唱术式与权限结界の完全解析书
前言
《前言之我与那个傲娇终端的同居战争》
某个平平无奇的深夜,当我第108次对着漆黑的终端窗口打出rm -rf /*
(然后被紧急掐掉电源)时,我确信这玩意儿绝对有自主意识。毕竟,普通程序怎么会用「权限不足」四个字嘲讽得如此抑扬顿挫?
「欢迎来到人机关系の新纪元。」
在这里,你的键盘是魔杖,sudo
是禁忌咒文,而root
权限则是潘多拉魔盒——每次打开前都得默念三遍「我有备份」。
本博客诞生于一场惨烈事故:某天我试图用chmod 777
给咖啡机提权(为了让它在凌晨三点自动煮咖啡),结果成功解锁了「全楼WiFi断连」成就。从此我顿悟:
「不懂权限的Shell玩家,终将成为sudo笑话。」
你将见证的史诗篇章包括:
《Shell咏唱失误录》:当
cat 论文.txt > 毕业答辩.pptx
让导师瞳孔地震时,我学会了管道不是水管《UIDの身份欺诈案》:普通用户伪装root的100种作死姿势
《chmodの黑暗兵法》:如何用一行代码让同事以为你黑进了五角大楼(然后被IT部门约谈)
阅读警告⚠️
文中所有「我在root权限下裸奔」的骚操作,均不建议模仿
如果读到一半发现终端开始对你冷笑,请速念
exit
退出当前会话最终解释权归「那个总把Ctrl+C按成Ctrl+V的菜鸟」所有
现在,请系好你的SSH安全绳,我们要潜入Bash回廊的二进制深渊了—— (终端:「哼,这次可别指望我给你自动补全!」)【之前的我是真中二】
1.shell命令以及运行原理
对于shell的讲解,准备先通过官方的语言来进行讲述,不过我相信大多数读者都不喜欢官方的语言,所以这里我就简单的讲述了,之后我会通过更加形象的语言来讲述一下,其实一张图片就可以讲述一下什么是shell命令以及运行原理。
下面我将使用一个小故事各位讲解什么是shell外壳。
1.第一个趣味小故事:外壳程序的运行原理
有一天,我(忘梓)从大学毕业了,那个时候年纪也比较大了,也没有女朋友什么的(o(╥﹏╥)o),我的村长父亲一直渴望能早点报上大胖孙子(不是我爹),所以当我回到家的时候,他强制我一定要去相亲,尽管我十万个理由不想去相亲,但是奈何不住村长父亲的天天催促,所以我想起了我小学的暗恋对象,就是隔壁的小张,于是我爹找到了十里八乡赫赫有名的媒婆——王婆(住在村东头),通过王婆来帮助我去隔壁说媒的。如下图所示:
当王婆找到了隔壁的小张的时候,此时小张还是很懵逼的,因为她并不晓得小学有个同学叫忘梓,在王婆的九寸不烂之舌下,小张想起了自己确实有这么个小学同学,不过小张看不上忘梓,于是直接就拒绝了王婆,后来王婆回来告诉我,小张并不同意和我相亲,事情就以这么个悲惨的故事结束了。回归正题,此时不难发现,在这个故事中,忘梓扮演着用户的角色,他把相亲这个命令交给了外壳程序(王婆),此时王婆在把意愿交给内核(小张),小张并不同意这个命令,于是把结果(失败)交给了外壳程序(王婆),王婆在告知用户(我)命令执行失败了,这便就是shell命令及其运行原理,可能有读者会想,外壳程序存在的意义到底是什么?我直接去告诉小张我喜欢她不就可以了,不要着急,下面还有个故事讲解外壳存在的意义。
2.第二个趣味小故事:外壳程序为何存在
还是有一天,忘梓从大学毕业了,他回到了自己的老家,日子一天天的过去了,忘梓也没有找到一个对象,并且他的村长父亲一直想要他领一个儿媳妇回家,就在忘梓冥思苦想的时候,突然瞥见了窗户外走过的小张,一瞬间,忘梓的心融化了,他想起了之前暗恋小张的日子,并且发觉小张长大后长的更漂亮了,于是想要再次追求小张,于是在一个天气很好的日子,忘梓提着一大袋礼品去了小张家,想要追求小张,不过当他敲开小张房门的时候,此时开门的是一个陌生的男子,与此同时小张的父母也看到了忘梓,因为小时候忘梓常常厚脸皮去小张家玩,于是她的父母都认识他,他们向他介绍这是小张的未婚夫xxx,此时忘梓也是个人才,他不要脸的向xxx告知他要追小张,并且甩袖子扬长而去,这个时候未婚夫也是生气了,于是立马就不在答应和小张结为夫妻,之后小张被村里人笑话了一辈子,于是小张一辈子也没有找到自己的另一半。这是没有王婆的情况下,如果有王婆的话,王婆会委婉的告知忘梓小张不喜欢他,并且答应一定帮他找一个更好看的,让忘梓找到了真正的另一半,所以此时不难看出,王婆(外壳程序)存在的意义其实是为了保护内核,拒绝非法请求,这便是外壳程序所存在的意义。
3.结尾
所以这边是shell命令及其运行的原理,我相信各位读者通过我的故事,可以更好的理解他们,当然,我的说法还是不太精准,所以如果想要了解精确的shell命令及其运行的原理,可以自行查询相关的书籍。
2.Linux权限
2.1.什么是权限
权限,在现实生活中是限制人的行为范围的规则。总而言之,权限实则是限制人的。而人 == 真实的人 + 身份角色,以我为例,我自己就是一个真实的人,而我目前的身份角色是一名学生;隔壁家的老王也是一个真实的人,他的角色是一个苦逼的打工人;而权限就是限制我和老王的,就比如我拥有使用自己电脑的权限,但是我不能傻了吧唧的去校长办公室玩校长电脑的。并且目标实物的属性,也是会影响权限的,所以权限==角色+事务属性,关于什么是事务属性,我的理解是这样的:就比如爱奇艺本身就是一个观看视频的软件,我不能在爱奇艺上写C++代码;github是著名的存放代码的平台,我不可以在github上看视频;这就是事务的属性;其实总结来说,权限就是影响你是否可以去完成一件事情的。
2.2.Linux权限
在Linux下,权限的概念也和我们日常的权限是相似的,它的核心是规定某个用户(或用户组)是否对某个文件(或目录)拥有读、写、执行等操作权利。
1.Linux的用户
Linux是一个多用户的操作系统,想必各位都知道这个知识点,因为用户数量多,所以他们其实有各自的职业,Linux的用户一般分为两种:root(超级用户),普通用户,而我们一般登录云服务器的时候,默认就是root用户,如下图所示:
因为超级用户的权限是最大的,可以说,没有什么权限会限制超级用户,所以在我们之前进行指令练习的时候,我们是体会不到权限对于我们影响的,因此我们需要通过一个指令去切换普通用户(前提:该用户已经被创建了,关于创建用户,我不知晓我之前的文章写过没,如果没写的话,我会单独创建一篇文章进行说明的)。
su 用户名 #例如:su wch
当我们切换完用户的时候,就会发现[]里面的名字会做出相应的更改。
此时我们就变为了普通用户,此时如果我们想要变回超级用户,那么我们需要再次输入一遍su指令。
su #还是在默认的目录
此时会提示我们输入密码,到这个时候就有读者疑惑了,为何我键盘输密码了,但是屏幕上不显示呢?这是Linux的特色,一般输入密码的时候,密码是不会回显的,这并不是bug,而是Linux所拥有的特点,这点各位读者要记住。当然并不单单只有su这个指令,还有个指令叫做su -,这两个指令的区别在于:前者切换回超级用户的时候,位置还是所在的目录;后者切换回超级用户的时候,会回到超级用户的家目录,其实这俩就这一点区别,所以各位读者自行选择就好。
su - #会回到家目录
当我们想要超级用户切换回普通用户的时候,其实还有个快捷方式可以更快的实现,就是使用ctrl + d这个快捷键,可以快速做到用户的切换,这个小知识点各位读者要记住。当我们是普通用户的时候,我们是被权限所限制的,当我们想要使用一些特别的指令的时候,此时我们就需要使用sudo指令进行提权。
sudo 指令
当我们使用指令提权的时候,它需要让我们进行密码的输入,此时我们需要输入普通用户的密码,而非超级用户的密码,这里各位读者知晓就好,至于为啥,我也不懂,也没必要懂,不过其实这个时候如果我们创建文件,此时文件的拥有者(Linux的角色,等会会讲)会是root,因为当我们指令提权的时候,其实就是让我们暂时变成了超级用户,各位知道这个知识点就好。一般我们只有下载东西的时候,才会使用指令提权这个指令,关于下载的指令,我会在下一篇文章讲述,各位敬请期待。
2.Linux的角色
过去,当我们学习指令的时候,当我们输入ls -l指令的时候,会显示出一个文件的属性,当时我们并没有进行详细的讲述,不过我们现在学习了Linux的权限了,所以我们可以了解其中一部分了,就拿下面这个文件的属性为例。
其中红框框的内容代表着文件的拥有者和所属组,在Linux,角色有三种,分别是:拥有者,所属组以及other(其他用户),想必拥有者各位知道它的定义,它代表着拥有这个文件的人,可能有很多读者会有疑问,这个拥有者很好解释,为什么还会有所属组这个角色呢,关于这个角色的设立,相信各位看完我下面的故事,各位就知道为何有所属组了。
我是忘梓,此时我是一家互联网公司的小小程序员,有一天老板给我和小王都分配了一个任务,也就是赛马机制,意味着我们都做同一项任务,看看谁做的最快,有一天老板找到我,相要看看我程序写的怎么样了,如果没有所属组这个概念的话,那么老板就属于other,于是我把程序放开给other这个角色,正巧小王还没有写完几行代码,于是他在我给老板放开权限空隙的时候,偷偷把我的代码复制了一份(互联网小偷),于是后面我的进度就被小王赶上了,于是最后小王得到了丰厚的奖金。出现这样的原因就是因为Linux的角色太少了,所以所属组的出现,是确保我的文件仅仅可以确保给所属组的人看,而other是看不了我的程序的。这边是所属组存在的意义。
3.Linux的文件属性和权限属性
依旧以上面的图片为例,此时,我们可以仔细的学习文件的属性了,我把相应的图片放在下面,并依次给读者进行解释。
此时以上图为例,上面的属性开头的d和-想必各位读者都知晓了,我在之前指令部分的时候给各位讲过,d代表的是目录,而-则代表着文件,这其实只是文件类型的冰山一角,还有许多的文件类型。下面我来给各位展示相关的文件类型,各位读者了解即可,以后忘了的话可以回来看看我这篇文章。
d:文件夹(目录)
-:普通文件
l:软链接(类似Windows的快捷方式,后期会讲述)
b:块设备文件(例如硬盘,光驱)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接字文件(网络部分会细说)
下面我们接着上面的图片说d后面的这一大串字符串代表的意思,它们其实代表着文件的权限属性,从左到右,以三个为一组,分别代表着拥有者,所属组,other的读,写,可执行权限,如下面的详细图所示。
上图就是拥有者,所属组,其他用户所拥有的权限,以上图为例,此时这个文件的拥有者有着读和写的权限,所属组和拥有者一样,而其它用户仅仅有着读的权限,其他权限是没有的。此时如果我们用xiaozhang这个用户去使用这个文件,是可以读取此文件的内容,但是xiaozhang无法在这个C程序文件写程序,这便就是文件权限的作用,当然,此时就会有读者提问了,难道权限一旦定下就无法更改了吗?不不不,有个指令可以帮助我们修改用户的权限,下面我们就进入修改文件权限的章节。
4.文件权限的修改
在说到具体指令之前,我要给各位说明,文件权限的修改,仅仅只能是拥有者和root账户进行修改,这个很好解释,作为文件的主人,可以修改文件的权限是正常的;而超级用户就不用说了,整个操作系统的老大哥,修改个权限那都不是事,这点各位要记清。
chmod [角色+-权限] 文件名 #例如 chmod u+x ceshi.c 意味着给使用者增加可执行的权限
上面这个命令就是权限修改的命令,此时我们想要权限修改,就可以使用它;下面我来详细讲述一下它的语法。
当我们想要修改指定用户权限的时候,可以直接用角色+权限来进行权限的更正,当然,大前提是更改权限的角色是拥有者或者超级用户,有时候我们可能需要让整个文件的权限进行修改,此时我们就需要让角色为a,也就是all的缩写,代表了所有角色,各位读者这一点要记住。当我们想要增加权限的时候,就可以直接使用+号来进行增加,想要减去权限的时候,就可以使用-来进行减掉,这些操作为了让各位更直观的了解,读者可以参考下图进行理解。
当然,权限增改的方式不止这一种,还有一种需要通过八进制进行修改,我在这里并不想要讲述,我想在下篇文章讲到缺省权限的时候,再来带领着各位进行更深的了解。
5.其他的零碎知识点
1.关于可执行
提问:当我们给一个文件加入可执行的权利以后,我们真就可以执行这个文件了吗?答案显然是不可以的,不相信的读者可以自己整个文本文件,给它加上可执行权利,看看这个文件到底是否可以进行执行。这里我想给各位第一个知识点:Linux下的可执行 == 真的是一个可执行的文件+可执行权限,这点各位要牢记。
2.拥有者和所属组都是同一个用户的情况
可能读者在私下自己练习Linux权限的时候,会想:当一个用户同时为拥有者和所属组的时候,如果我们把拥有者的权限全部去掉,但是所属组保留,是否还可以对文件进行查找和修改。答案显然是不对的,如果真这样的话,权限其实也不会太限制用户了,在Linux下,拥有者,所属组和other和我自己进行身份对比的时候,依次只对比一次!意味着当我们是拥有者的时候,此时我们权限没了,我们不在会以所属组的身份对文件进行修改了。
3.关于r权限
当一个用户没有r权限的时候,这意味着我们使用无论是cat,nano还是vim的时候,都无法查看文件的内容了,各位要谨记:权限,限制的是人!
3.感慨
今天的文章到这里也就结束了,权限这部分我留了一点小尾巴,我决定放在下一篇的文章进行讲述,讲真的,我得接近半年没学习Linux系统部分了,这篇文章是我今年四月份的时候进行书写的,由于我一直没有认真的学Linux了,因此我不敢将这篇博客进行发布,现在我准备重新去学习Linux了,所以这篇文章得以发表,我会记住我之前定下的目标,这个月发布十篇博客!如果文章有错误,可以在评论区指出,我会定时的进行更改,一起学习的时光总是短暂的,那么各位大佬们,我们下一篇文章见啦!