目录
前言:
上篇博客我们对Linux背景以及Linux当中的常见指令进行了介绍,本篇博客我们将开启对Linux的外壳程序包括Linux当中的用户都有哪些,以及用户的权限又有哪些,包括粘滞位的设置,希望大家有所收获。
1. shell的感性理解
我们使用Linux的时候都知道Ubuntu、Centos等,当然我使用的是Centos环境,我想我们肯定有一个这样的疑惑,这啥玩意?它和Linux又是啥关系?我们不是用Linux吗,怎么需要先搞个这玩意,其实Centos包括Ubuntu等都是Linux,不过这个Linux不是指Linux内核,而是内核+外壳程序(shell),安卓手机在设置当中查看系统信息你就会发现它使用的也是Linux内核,不过就是将这个外壳程序换成安卓的操作界面而已,鸿蒙是不是呢?也是的,它只不过就是将安卓的那个外壳程序去掉,换成是鸿蒙的操作界面而已,包括我们的Windows系统,不过人家用的不是人Linux,只不过它的操作界面就是一种外壳程序,这个外壳程序就是shell。这个shell在Linux上直观的表现就是命令行解释器,不同的系统,命令行解释器的设置不同,包括一些指令什么的。
所以shell是什么呢?为什么要有shell?
上述包裹着操作系统的就是外壳程序,它是什么呢?其实shell就是一个用于用户和操作系统进行交流的媒介,因为我们不擅长和操作系统打交道,让你说,是让你和一堆繁杂的代码打交道容易还是和命令行解释器当中的一些指令、或者是Windows当中的操作界面打交道容易,相信是和第二者较为容易,所以这就是shell。
shell的作用:
1. 作为用户和操作系统打交道的媒介。
2. 变相的保护操作系统。解释:就是说对于非法的指令,shell是不会把这部分指令传交给操作系统的,eg:在Linux当中随便输入一个指令,会显示该指令不存在。
一般而言,执行命令是通过派生子进程的方式执行用户的指令而shell本身并不执行对应的指令,这一点等到进程部分我们再进行仔细介绍。
2. 权限
对于权限部分,我们先从Linux下的用户说起,再介绍几个有关用户切换的指令说起,继而进行权限的详细的介绍。
基本的用户认识:
我们都知道Linux下有root和普通用户之分,root是什么呢?就是大BOSS,无所不能,不受任何权限约束,所以我们root的密码一定要设置的足够复杂并且要记住它,以防被不法分子入侵,对我们的服务器做出什么违法操作。普通用户呢,这就是平民老百姓了,咱只能是唯唯诺诺、老老实实的做好普通用户能做的事,当好牛马喽!当然如果有一天老板瞅见了我们,如此勤劳,任劳任怨,老板说小伙子,好样的,升你做部门经理,从此我们也进入了管理部门😆
用户切换指令:
普通用户 --> root 使用su / su- ,其中su是只进行权限切换成root,而su-是不仅切换成root而且路径切换成root目录,当然切换需要输入root密码。切换之后想回退ctrl+d / exit
root --> 普通用户,su XXX 那真的是平步青云,不需要任何约束,密码都不需要输。
sudo 指令:不切换用户,只让普通用户,以root的身份,执行对应的指令。但是这是有前提的,就是当前用户要添加到/eto/sudoers中(有点类似于白名单,也和上述老板相信我们类似),这个指令使用的时候输入的是我们自己用户的密码(是为了给受信任的用户提供最少的执行障碍)
下面我们正式引出权限这个概念
什么是权限呢?
日常生活中我们都见过什么QQ会员、爱奇艺VIP等等,它们是不是就是通过赋予人一定的角色让人拥有某些特定的权利,可以看某些电影、可以加速成长,这就是权限,当然你说什么QQ会员、爱奇艺VIP能不能抱着啃一口,当然不能,它是虚拟的,所以它就天然没有被吃的权限,所以权限是什么,权限就是一件事情是否允许被谁做。谁:就是人。做:就是目标对象
对于Linux当中的文件权限 = 人 + 文件属性
人-------->角色----------->其他人(other)------------>所属组(grouper)-------------->拥有者(owner)
文件属性:w(写权限)、r(读权限)、x(执行权限)
下面进行解释:
你说Linux下人的角色有拥有者和其它人我懂,不就是文件的所属关系,就是是不是我的嘛,那所属组又是啥玩意?下面举个例子进行解释,有一家公司(tx),它们的企业文化就是允许企业内部不同部门的团队可以同时开发同一款产品,谁做的好用谁的,你说如果这两个部门在同一个服务器上进行开发,其中某部门领导想看该部门的成员所写的代码,但是他是other,怎么办?如果该成员对other开权限,另一个团队的人也可以看,人家一看,心想原来那个部门写的代码如此之龊,我们稳了🤣, 你说这样合理吗?当然不合理,所以Linux下提供了所属组这样的一个功能,就是我们可以不对other开权限但是,我可以将所属组的权限打开,这样我们团队内部就可以看我写的代码,这就是所属组所应用的场景。
如上所述第一个hab就是文件的拥有者,第二个hab就是所属组,当前只有我自己为一组
相信看到上述的一堆都会被前一串字母吸引,下面先对第一个字母进行介绍:
第一个字符就是文件类型,在Linux下是不以文件名后缀来区分文件的,这点与Windows下是有很大的区别的,如果要使用后缀,仅仅是给用户提供一个提示作用的符号,其实也就是文件名的一部分。需要注意一点的是,虽然Linux不以文件后缀区分文件,但不代表gcc等工具不在意后缀名,人家是在意的,所以我们要养成良好的习惯,尽量命名的时候就做好区分
Linux常见的文件类型符号如下:
- -:普通文件(源代码、库文件、可执行程序、文档压缩包等)
- d:目录文件
- c:字符设备文件(键盘、显示器等)
- b:块设备(磁盘)
- l:链接文件(如windows桌面的快捷方式本质就是一种链接文件)
- p:管道文件
怎么操作权限?
其它九个字符为rwx是不是和文件属性看着类似哇,而且是9个我们角色也就三个,怎么那么巧,没错这就是三个角色的读写可执行的权限,例如上述的csdn目录,rwxrwxr-x,第一个rwx(拥有者的)第二个rwx(所属组的),第三个r-x(others的)。下面进行介绍怎么进行操作这些权限,当然前面我们介绍权限时就说过,权限时什么人能干什么事,因此下面从两方面去操作权限:
设置文件属性:
chmod 选型 XXX(文件):eg:chmod u-rwx csdn,其中u就是拥有者的权限,g是所属组的权限,o就是other的权限,a就是修改所有的,需要格外注意的是修改文件权限只能这个文件是我的才能改,即你是这个文件的拥有者,当然如果是root的话,谁也管不住,想改谁就改谁。
当然上述的这是一种方式,还有另外一种方式,八进制方案法,rwx其中每一位有效就是1,那么如rwx三个均有权限就是111即7,则要设置rwx权限只需777,如下所示:
设置文件所属角色:
一个文件有拥有者,那这个拥有者能不能改呢,当然,包括所属组也是都是可以改的,不过我们给别人一个东西是你说给就给的?好东西人家说不定要,要是一个病毒代码,你给人家,人家要?所以可以给但是不能以你的身份给,root是大管家,我们都相信root,所以要实现这样的一个功能必须进行sudo提权或者以root的身份。所以,完整指令:sudo chown XXX(用户) XXX(文件名),这条指令是修改用户的,sudo chgrp XXX(某所属组) XXX(文件名),这是修改所属组的,sudo chown XXX:XXX(第一个XXX是拥有者,第二个XXX是所属组) XXX(文件名),这个是可以一并修改拥有者和所属组的,具体如下所示:
为什么要有权限?
因为有了权限,所以在多用户开发场景当中可以进行有效的组织管理,因此有权限可以便于我们系统进行安全管理
补充知识:
问题1:你说如上为啥我们创建一个新目录它的权限是rwxrwxr-x,新普通文件是rw-rw-r--,为啥是这个样子它怎么不都是rwxrwxrwx,这里Linux有一个规定就是目录起始权限777(rwxrwxrwx)普通文件起始权限是666(rw-rw-rw-),但是Linux有一个umask(系统默认会配置好umask权限掩码,默认是0002(八进制)),即凡是umask中出现的权限都必须在起始权限中去掉。
啥意思?举个例子:我们说新目录是rwxrwxr-x,但是它的起始权限是rwxrwxrwx(111111111),umask是000000010,所以去掉umask中出现的权限,是不是就变成了111111101(rwxrwxr-x),所以它的运算机制是:最终权限=起始权限&(~umask),就是先对umask按位取反再与起始权限按位与。
问题2:如果我们要进入一个目录,需要什么权限?先告诉答案,是x(执行)权限
r权限是决定你进入目录之后是否可以看目录里面的文件
w权限是决定你进入目录之后能否在目录里面对文件进行操作即增删文件
x权限就是决定你是否可以进入目录
这也就是为什么我们目录的起始权限是777,因为我们要能进入,进入之后也要能看到文件,能看到文件我们也要能创建文件,所以是rwx。
相信大家可能有这样的一个疑惑,虽然我们拥有者的权限是被改了,但是我还是所属组里的成员,为什么不让我进入目录,是这样的,Linux下是从拥有者所属组other逐一进行匹配的,首先匹配到哪个你就是哪个角色,类似于if elseif elseif的机制原理。
粘滞位
背景知识:就是在一个服务器当中大家都有自己的家目录,大家在自己的家目录里进行文件的增删查改,但是如果有些信息是大家共同需要的,那咋办?所以呢,Linux有一个公共的目录的场景,其实不就是拥有者所属组其他人的权限全放开,诶你说这个目录文件既然是大家共有的,谁创建比较好,张三说我创建,李四还说我创建呢,所以root说我创建,谁都没话说,因此公共的目录是超级管理员root创建的,大家在该目录下进行文件的增删查改。
现象:该目录是除了大家共有外,其它的和正常的目录没有任何区别,因此上述我们所讲权限的设置,以及权限对于用户的约束是都正常的,但是有个问题,就是如果张三有个文件在该目录下,这个文件的other权限全屏蔽了,李四这边不乐意了,公共目录下,你竟然不让我看什么鬼,一恼火直接给你删了,此时该文件就被李四删了,张三不乐意了,我的文件你凭啥删,这不出问题了。如下所示:
你说导致这个问题的本质原因是谁造成的,是这个文件造成的吗?文件不乐意了,诶你Linux下的权限那一套我是遵守的,该是谁看我就是让谁看,我一个小小的文件让我背这个锅我可不背,所以谁造成的,上面我们不是讲了进入目录需要哪些权限,以及包括其它权限都起到什么作用嘛,因此这个锅该目录背,你公共目录天然的就设置了在目录里other可以进行w权限,那李四当然就可以去删除该目录里的文件, root说,好好好,说到底把锅甩给我了是吧,我非给你想个法子不行,因此粘滞位来了。
所以粘滞位就是在公共目录下不让其他人去删属于我们的文件,禁止大家互删文件。
张三说,好好好,李四你有种,你删我文件,我非要删你一个不行,root这时出来管事,你们俩吵的挺热闹,我给你加上粘滞位,看你还删,张三只能暗暗叫屈。如下所示:
从加上粘滞位开始,公共目录就恢复了往日的宁静,因此加了粘滞位的目录,里面的文件就只能被root或者是拥有者删除。
至此我们的权限部分已经介绍完毕。
总结:
本文主要介绍了 shell 和权限的相关知识。shell 是用户与操作系统交流的媒介,能变相保护操作系统。Linux 下有 root 和普通用户之分,可通过 su、sudo 等指令进行用户切换。文件权限涉及拥有者、所属组和其他人,有读、写、执行等属性,可用 chmod、chown、chgrp 等指令操作。权限设置可有效组织管理多用户开发场景,保障系统安全。还介绍了粘滞位的作用,即在公共目录下防止他人删除自己的文件。