广义上,Linux发行版=Linux内核+外壳程序,而Linux在严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel?
从技术角度,Shell的最简单定义:命令行解释器(command Interpreter)主要包含:
对比windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)。
shell 对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运行出结果,通过shell解析给用户。
接下来我们通过一个小故事来帮助我们理解这些。
你是你们村村长的儿子,过年了你回到家,父母问你谈对象没有?你说还没谈,然后父母又问那你有没有喜欢的人呢?你和父母说你喜欢隔壁村的小芳。这个时候由于你是个一个比较害羞的小伙子不敢和小芳表白,那就让你家人找媒婆帮你去隔壁村提亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给小花,而我们找到媒婆姓王,所以我们叫它王婆,它对应我们常使用的bash。
这个故事里面:你就是使用者、小芳就是核心(kernel)媒婆就是我们的Shell,而这里的王婆就是bash。Shell是所有外壳程序的统称,例如在centos7当中的外壳程序名就叫做bash。
Linux下有两种用户:超级用户(root)、普通用户
- root:超级管理员,具有非常高的权限,基本上可以说它能在Linux系统下做任何事情不受限制。
- 普通用户:具有一般权限,需要受权限约束,在Linux下做有限的事情
- 超级用户的命令提示符是“#”,普通用户的命令提示符是“$”
我们知道了Linux下有两种用户,那么这个时候就可能会有人问了,那可以在他们两者之间相互切换用户身份嘛?
答案是可以的
语法: su [用户名]
功能: 切换用户
例如:
要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 suroot(root可以省略),此时系统会提示输入root用户的口令。
从普通用户切换到root用户:
从root用户切换到普通用户:
切换用户后,如果想切回上次的用户,可通过Ctrl+D或者exit来实现
我们知道了如何在root用户与普通用户之间切换身份,这个时候可能又有人会问了,假如我们想使用一个指令,但是普通用户的权限不够,必须得有root权限,可是我又不想切换成root用户,这个时候应该怎么做呢?
语法: sudo
功能: 临时权限提升,执行后续命令,以root身份执行
示例:
我想以一个普通用户的身份去修改云服务器上另外一个普通用户的密码
当你输入完你的密码之后,可能会出现以下提示。
这个提示的意思是说:你没有被超级用户(root)添加到信任列表当中,因此当前的权限提升不了,我们可以稍微想一下:当然不能够给所有普通用户都添加信任列表当中啊,如果每个普通用户都在信任列表当中,那我可以提升权限去修改你的密码,查看你的隐私,甚至是删除你的所有文件,这将会是一件很可怕的事情。因此只有当这个普通用户被root用户添加到信任列表后,它才能够拥有临时权限提升的能力。
对于如何添加信任列表我们放到后面再将。
在讲下面的内容之前我们先来说一下权限。
理解一下什么是权限:一件事情是否允许被特定的人做,权限约束的是人,文件本身具有天然的权限属性:r(读)+w(写)+x(可执行)
举个例子:
假如我们要使用腾讯视频这个APP去看电影或者电视剧,如果你就是一个普通用户,那么你就只能看一些免费的电影、电视剧或者动漫,但是你如果是VIP用户,那么腾讯视频上面的大部分电影、电视剧或者动漫你都可以看这个就是人的权限。再者说一部电影,它被上架了那么这部电影就可以给某些具有特定权限的人去看,如果它被下架了那么我们可以搜索到这个电影的名字,但是我们看不了这部电影了,因为任何人都没有权限去观看它了。
因此我们就可以这样理解:权限 = 人 + 事物的属性
对于用户来说,权限可以讲用户分成三大类:
注意:
例如:老师、学生、工人、白领等等这些它们都是只是个身份,但这些身份的背后都是一个一个的对象或者人去扮演的,甚至说一个人可以有多种身份。
这个时候大家就会有点好奇了,为什么还会有所属组这个概念呢?那我们下面来讲一个小故事吧
假如在某个互联网公司里面的一个游戏开发部门,有A与B两个小组但是这个部门只有一台服务器。而这个时候呢我们的A组与B组进行着同一类型项目的开发。
如果没有所属组的概念,假如说你叫张三,讲该项目的雏形已经做好了,然后准备发给你的上司让他帮忙看一下,但是你上司说我这看不了你的文件啊,你的文件只有你自己能看啊。这个时候你就可能想着:那我把我的文件发出来吧,这样的话上司就能看了,可是发出来了之后又存在了一个问题。我们跟A组是竞争关系,我们是共用一台服务器的,如果我把文件发出来,不光上司和我组的组员能看到同时A组他们也能看到我做的了。你如果做的好他们可能会抄袭你的,做得不好他们可能还会在背后嘲笑你。那么我怎么样才能将该文件让我自己和同组的组员看到而不让A组的人看到呢?
这个时候所属组的作用就能够得以体现了,你可以将文件设置为仅拥有者和所属组可见。这样的话除了你和你同组的组员之后,other便不能查看这个文件了。
下面我们来通过ll指令查看一下某一文件或者文件目录的拥有者和所属组吧
这个时候可能又有人会问了:你不是说文件访问者是有三类嘛,怎么这里只见拥有者和所属组而不见other呢?
注: 这是因为除了拥有者和所属组之外,其他的都属于other,因此这里就不需要再特定的去标识哪个是other了。
我们上面说过权限 = 人+事物的属性
人我们说完了,接下来我们来说一下文件的类型和文件的访问权限(即事物的属性)文件是否具有(r)可读、(w)可写、(x)可执行的属性。
a.文件类型
我们通过ll指令来查看一下文件的类型
这一列标识文件类型
d:文件夹
-:普通文件
l:软链接(类似Windows的快捷方式)
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接口文件
注意: 在Linux系统中,不以文件后缀作为区分文件类型的方式。
b. 文件访问权限
同样的我们通过ll指令来查看一下文件的访问权限
这里一共有9列,权限的前3列表示文件所有者的权限,中间3列表示文件所属组的权限,后3列表示其他用户的访问权限。
每一组的三个字符的第一个字符代表该文件是否具有可读属性,第二个字符表示该文件是否具有可写属性,第三个字符代表该文件是否具有可执行属性。
如果具有可读属性则第一个字符为r,否则就是-,如果具有可写属性则第二个字符为w,否则就是-,如果具有可执行属性那么第三个字符为x,否则就是-
我们使用ll指令查看文件权限时的表示方法就是字符表示法
Linux表示 | 说明 |
---|---|
r– | 只读 |
-w- | 仅可写 |
–x | 仅可执行 |
rw- | 可读可写 |
-wx | 可写和可执行 |
r-x | 可读可执行 |
rwx | 可读可写可执行 |
— | 无权限 |
字符表示法中每一个字符所在位置所表示的结果只有两种可能,要么为真(1),要么为假(0)。因此我们就可以将这三个字符用三个二进制位来表示,进而转换位一共八进制位来表示。
权限符号(读写执行) | 八进制 | 二进制 |
---|---|---|
r | 4 | 100 |
w | 2 | 010 |
x | 1 | 001 |
rw | 6 | 110 |
rx | 5 | 101 |
wx | 3 | 011 |
rwx | 7 | 111 |
— | 0 | 000 |
1)chmod
功能: 设置文件的访问权限
格式: chmod [参数] 权限 文件名
常用选项:
chmod命令权限值的格式
格式一:用户表示符+/-=权限字符
- +:向权限范围增加权限代号所表示的权限
- -:向权限范围取消权限代号所表示的权限
- =:向权限范围赋予权限代号所表示的权限
用户符号:
- u:拥有者
- g:所属组
- o:其他用户
- a:所有用户
如果要想同时设置不同类用户的访问权限,则需要使用逗号隔开
格式二: 三位8进制数字
上面我们说过文件权限值的表示即可以用字符来表示,同样也可以用八进制数字来表示。
那么这里同样的我们也可以通过设置相应的八进制数字,将该八进制数字转换成二进制数字从而设置对应的权限
2)chown
功能: 修改文件的拥有者
格式: chown [参数] 用户名 文件名
说明: 只有root用户才可以改变文件的拥有者,普通用户想修改文件拥有者就需要进行权限提升
可以看到普通用户是无法修改文件的拥有者的。
我们还可以使用chown同时修改文件的拥有者和所属组,但是需要用冒号隔开
3)chgrp
功能: 修改文件或目录的所属组
格式: chgrp [参数] 用户组名 文件名
常用选项: -R递归修改文件或者目录的所属组
注意: 只有root用户才可以改变文件的所属组,普通用户想修改文件所属组就需要进行权限提升
示例:
我们新建一个文件和目录,它们都有自己的默认权限。
实际上,新建文件的默认权限为666,而新建目录的默认权限为777。
但是我们所创建的文件和目录,默认权限却不是上面这个值,这是为什么呢?
原因是创建文件或目录的时候还要受到umask的影响。假设默认权限是mask,则实际创建的出来的文件权限是: mask &( ~umask)
因此这就是为什么我们新建文件或者目录的默认权限和我们创建出来的文件或者目录的权限是不一样的。
那么我们有没有办法修改文件掩码呢?答案是有的
下面我们再来看一条指令
4)umask
功能: 查看或修改文件掩码
格式: umask 权限值
说明: 将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为0022,普通用户默认为0002。
示例:
注意: 你修改的权限掩码只在本次登录有效,下次登陆的时候会恢复成默认的权限掩码
对于文件来说,其可读、可写、可执行的属性我们知道分别代表着什么操作,那么对于目录而言可读、可写、可执行又代表的是什么呢?
- 可读权限:如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容.
- 可写权限:如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件.
- 可执行权限:如果目录没有可执行权限, 则无法cd到目录中.
因此这个时候就会出现一个大问题:
只要用户拥有某个目录的写权限,那么就可以删除该目录下的文件,而且不论这个用户是否具有这个文件的写权限。
这就很离谱了,我张三创建的文件,凭什么可以被李四你删除掉?我们下面来验证一下
为了解决这个不合理的问题,Linux引入了粘滞位的概念
用法: chmod +t 目录名
功能: 给目录加上粘滞位
当一个用户将一个目录加上粘滞位后,该目录的权限值的最后一位变成字符"t"
当你给一个目录加上粘滞位后,即使某个用户对于该目录有可写的权限,那么他将不能再删除该目录不属于他的文件,但是可以创建文件或者删除属于自己的文件。
总结:当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由以下用户删除