目录
一、shell的运行原理
Windows以图形化界面为交互方式,而Linux以命令行界面为交互方式。Windows和Linux的交互方式虽然不同,但本质上是一样的,图形化界面和命令行界面都是为了让用户进行相关操作,而图形化界面和命令行界面即"外壳程序"
Linux严格意义上说是一个操作系统内核,被称为"核心(kernel)",但一般用户不能直接使用kernel,而是通过kernel的"外壳程序",即Shell,来与kernel沟通
Shell即"命令行解释器":
- 将使用者的命令翻译给核心(kernel)处理
- 将核心的处理结果翻译给使用者
对比Windows中的图形化界面(GUI),操作Windows并不是直接操作Windows内核,而是通过图形接口,点击,从而完成操作。Shell对于Linux具有相同的作用,主要是对用户指令进行解析,解析后交给Linux内核,反馈结果再通过内核运行出结果,通过Shell解析给用户
Shell的意义:
- 是用户和操作系统交互的中间软件层
- 可以在一定程度上起到保护操作系统的作用
Shell运行原理:
- 创建子进程,让子进程进行命令行解释
- 子进程出现任何问题,都不影响父进程Shell
对比到Windows中就是,每运行一个程序就是创建一个子进程,如:微信、QQ。这些子进程中任何一个进程出现问题,都不会影响父进程
注意: Shell只是所有外壳程序的统称。如:在CentOS 7中的外壳程序名为bash
二、Linux权限的概念
在Linux下有两种用户,分别是超级用户(root)和普通用户。超级用户可以在Linux下做任何事情,几乎不受限制,而普通用户一般仅能在自己的工作目录下(/home/xxx)工作,以及在系统上做有限的工作。可以认为,权限的概念是用来限制普通用户的,超级用户几乎不受限制
超级用户的命令提示符为"#"
普通用户的命令提示符为"$"
2.1 用户账号切换
当权限不足时,需从普通用户切换为root用户
su 用户名
从普通用户切换为root用户,输入su root后,输入root账户密码即可
或者使用su或su -命令
su与su - 命令的区别:
- su只是切换了root身份,但Shell环境仍然是普通用户的Shell;而su -连用户和Shell环境一起切换成root身份了。只有切换了Shell环境才不会出现PATH环境变量错误
- su切换成root用户以后,工作目录仍然是普通用户的工作目录;而用su -命令切换以后,工作目录变成root的工作目录了
从root账号切换为普通账号,不需输入密码
注意:
- 从普通账号切换为root账号时,指令中的root可省略,因为root账号只有一个
- 该指令也可以从一个普通用户切换为另一个普通用户,输入待切换用户的账号密码即可
- 切换用户后,若想切回上次的用户,可通过Ctrl+D实现
2.2 仅提升当前指令的权限
在公司中大概率是不会拥有root账户的,但有时执行某些操作时权限不足,就需要有临时提升权限的方式
以普通用户的身份,修改另一个普通用户的密码
但并不是所用用户都可以使用sudo指令的
上图提示tmp用户不存在sudoers文件中,所以指令的权限得不到提升,只有被root用户添加到信任列表后,才拥有提升指令权限的能力
2.3 将普通用户添加到信任列表
必须处于root账户下,才能进行该操作
使用vim /etc/sudoers指令打开配置文件,找到%wheel ALL=(ALL) ALL处,在后续按图中案例添加即可
添加完毕后,该用户就可以使用sudo指令,即拥有提升权限的能力了
三、Linux权限管理
3.1 文件访问者的分类
- 文件和文件目录的所有者(文件拥有者)
- 文件拥有者所在的组的用户(文件所属组)
- 其他用户(other)
注意:
- 对于某一文件而言,其拥有者、所属组和other由超级用户(root)和普通用户所扮演
- 在Linux中,所有用户都隶属于某一个组,哪怕这个组只有一个用户(此时该组就以该用户的用户名为组名)
所属组
在某个公司中有两个小组团队(A组、B组)在同一个Linux服务器上进行着同一款项目的开发(赛马模式),而你就是A组中的一员
若没有所属组的概念,那么创建了一个文件后,要么就是只有拥有者能看到,要么就是其他人都能看到。而在实际情况中,希望的是拥有者和所在小组的小组成员都能看到,其他人看不到。于是就有了所属组这个概念,可以将文件设置为拥有者和所属组可见,而other不可见。所以所属组的存在是为了更灵活的进行权限配置,满足团队协作
可以通过指令ll来查看某一文件或文件目录的拥有者和所属组
3.2 文件类型和访问权限
使用指令ll,可以看到前面有一串字符,这串字符就代表着该文件的类型和属性
这串字符由10个字符组成的。其中第一个字符所代表的就是该文件的文件类型
- -:普通文件
- d:目录
- l:链接文件(类似于Windows中的快捷方式)
- b:块设备文件(如硬盘、光驱等)
- p:管道文件
- c:字符设备文件
- s:套接字文件
注意: 在Linux中,文件类型与文件后缀无关
剩下的9个字符每三个为一组,分别代表该文件相对于其拥有者、所属组以及other是否拥有某种属性
每一组的三个字符的第一个字符代表该文件是否具有可读属性,第二个代表是否具有可写属性,第三个代表是否具有可执行属性。若是具有可读属性,则第一个位置的字符为r;若是具有可写属性,则第二个位置的字符为w;若是具有可执行属性,则第三个位置的字符为x。若某一位置为字符 - ,则说明不具有对应位置的属性
举例
data.txt文件是一个普通文件,该文件的拥有者和所属组对其都是可读可写的,但该文件的other对其只有读的权力
3.3 字符权限值的表示方法
3.3.1 字符表示方法
ll指令打印文件权限值时的表示方法就是字符表示法
3.3.2 八进制表示法
字符表示法中的每一个字符所在位置所表示的结果只有两种可能(真或假),因此可将这三个字符换为三个二进制位,进而换为一个八进制数进行表示
3.4 文件访问权限的相关设置方法
3.4.1 修改文件的访问权限
符号设定法
chmod [who] [+-=] [mode] 文件名
常用选项: -R 递归修改目录文件的权限
- +:向权限范围增加权限代号所表示的权限
- -:向权限范围取消权限代号所表示的权限
- =:向权限范围赋予权限代号所表示的权限
who:
- u:拥有者
- g:所属组
- o:other
- a:所有用户
向tmp.txt文件添加other可写
数字设定法
chmod [numbers] filename
将对应的八进制数转换为二进制,进而设置对应权限值
- 0:没有权限
- 1:执行权限
- 2:写权限
- 4:读权限
给stat1.cpp文件设置权限为-rw-rw-r--
3.4.2 修改文件的所有者
chown 文件所有者 文件名
常用选项: -R 递归修改目录文件的拥有者
修改stat1.cpp文件的所有者为gg-bruse
注意: 修改文件的拥有者需root用户进行操作,若是普通用户则需进行权限提升
3.4.3 修改文件的所属组
chown 文件所有者:文件所属组 文件名
chgrp 文件所属组 文件名
修改stat1.cpp文件的所有者和所属组为gg-bruse
修改文件stat1.cpp的文件所属组为gg-bruse
3.4.4 修改文件掩码
查看新建的文件和目录,都有各自默认的权限
新建文件的默认权限为0666,新建目录的默认权限为0777。其中第一位的0与特殊权限有关,这里不必深究,而后面三位就是权限的八进制数值表示方法,将其翻译为字符表示方法
但实际上创建出来的文件和目录的权限值与翻译出来的值并不相同,原因就是创建文件和目录的时候还受到umask的影响,假设默认权限是mask,则实际创建出来的文件权限是:mask&(~umask)
umask 权限值 #使用umask指令可以查看或修改文件掩码
实际创建出来的文件和目录的权限值还需进行进一步换算才能得出。首先将掩码的的后三位八进制换算为二进制,然后对其按位取反
然后将之前的新建文件的默认权限值和新建目录的默认权限值分别与其进行按位与操作,得到的就是我们创建出来的文件和目录的权限值
也可以理解为在umask中出现的权限位,在最终权限中都不会出现
注意: 超级用户的默认掩码为0022,普通用户的默认掩码为0002
3.5 目录的权限
- 可读权限: 若用户没有该目录的可读权限,则无法通过ls指令查看目录中的文件内容
- 可写权限: 若用户没有该目录的可写权限,则无法通过一系列指令在目录中创建文件或删除文件
- 可执行权限: 若用户没有该目录的可执行权限,则无法通过cd指令进入到目录中
此时就出现了一个问题:当许多用户在一个共享目录下进行工作时,即都对该目录具有读写执行权限(如:Linux根目录下的tmp目录)。但是此时,即使别人对我的文件没有任何权限,也可以删除我创建的文件,同理我也可以删除别人创建的文件。但是这种情况并不是期望发生的,此时就可以通过对目录设置粘滞位来解决问题
3.6 粘滞位
chmod +t 目录名
将某一个目录加上粘滞位后,该目录的权限值的最后一位变为字符"t"
此时另一个用户就算有该目录的可写权限,也无法删除该目录下的文件
当一个目录被设置为粘滞位,则该目录下的文件只能由:
- 超级用户删除
- 该目录的拥有者删除
- 该文件的拥有者删除
注意: 虽然目录被加上了粘滞位,但若用户有该目录的可写权限,不影响其在该目录下创建文件。若要删除粘滞位,只能谁设置的谁删除(root除外)