Linux(2)——shell原理及Linux中的权限
目录
一、shell的运行原理
二、Linux中权限的问题
1.权限的概念
2.如何进行用户的切换
1)从普通用户切到超级用户
2)从root用户切到普通用户
3.如何实现提权操作
4.如何将普通用户添加到信用列表(sudoers)
编辑5.Linux的权限管理
1)那么组的概念是什么?
2)文件类型和访问权限
3)文件权限值的表示方法
a)字符表示方法
b)八进制数值表示法
4)文件访问权限的相关设置方法
a)如何改变文件的访问权限
b)如何改变文件的拥有者
c)如何改变文件的所属组
d)如何修改文件的掩码
5)目录的权限
粘滞位
一、shell的运行原理
一般我们常用的windows操作界面主要是以图形化界面为主,而我们Linux则是主要以命令行界面为主,其实本质上这两种操作界面都是包裹在操作系统核心外层的外壳程序。
我们用户一般不能直接的与Linux系统核心(kernel)进行交互,一般是通过像shell这样的外壳程序间接的与内核进行交互。
"shell"是一种命令行解释器,其主要表现在:(1)将使用者的命令翻译给给系统核心(kernel);(2)将核心处理的结果返回给给用户。
shell的运行原理:
1)创建子进程,让子进程进行命令行的解释。
2)子进程不会影响到父进程的运行。
我们其实可以联想到我们经常使用到的windows系统,我们每运行一个程序就创建了一个子进程。而这些子程序当中有任何一个程序出现问题都不会影响到其他程序。例如,我们运行QQ,即使QQ卡死了,我们的其他程序依然正常的在运行。
敲黑板:shell只是所有外壳程序的统称,并不单单指某一个程序,在centos7中外壳程序名叫bash。
二、Linux中权限的问题
1.权限的概念
在Linux下有两种用户,一个是超级用户(root)和普通用户(用户名)。超级用户可以在Linux下做几乎任何事,而普通用户一般只能在自己的工作目录下(/home/xxx)工作,以及在系统上做有限的工作。
换句话来说,所有的权限的概念都是用来限制普通用户的,而超级用户几乎不受限制。
超级用户的提示符是“#”:
普通用户的提示符是"$":
2.如何进行用户的切换
语法: su 用户名
功能: 用户切换。
1)从普通用户切到超级用户
这个过程需要输入root账户的密码(密码不回显)
2)从root用户切到普通用户
这里就不用输入密码了(由此可见root用户的权限之大)
敲黑板:
1)从普通账号切换为root账号时,指令当中的root可省略,因为root账号只有一个。
2)该指令也可以从一个普通用户切换为另一个普通用户,输入待切换用户的账号密码即可。
3)切换用户后,若想切回上次的用户,可通过Ctrl+D实现。
3.如何实现提权操作
如果你只是想提升当前用户的权限,并不想切换用户,你该怎么做呢?
语法: sudo 指令
功能: 提升当前指令的权限。
我们先来设想一个场景,你是一个普通用户,而你却想修改另一个人的密码来恶搞别人,你该怎么做呢?
当我们输入完我们的密码后,会出现以上提示。
该提示是说你没有被超级用户(root)添加到信用列表(sudoers)当中,所以该条指令的权限得不到提升(你可以想想嘛,怎么可能让一个普通用户随意更改另一个普通用户的密码),只有当你被超级用户添加到信任列表后,你才拥有提升当前指令权限的能力 。
4.如何将普通用户添加到信用列表(sudoers)
首先你得先切换到超级用户,只有超级用户才有权力将普通用户添加到信任列表。
切换到超级用户后,我们使用vim打开文件sudoers进行添加。
点击一下i进入插入模式(编辑),编辑完成后shift+:然后输入wq(保存并退出)。
添加完毕后,该用户就可以使用sudo指令,也就是拥有提升当前指令权限的能力了。
先输入当前用户的密码,在设置密码。
5.Linux的权限管理
对于用户而言,权限可以将用户分为三大类,分别是:
1)文件和文件目录的所有者(文件拥有者)。
2)文件拥有者所在的组的用户(文件所属组)。
3)其他用户(other)。
敲黑板:
1)对于某一文件而言,其拥有者、所属组和other就是由超级用户(root)和普通用户所扮演。
2)在Linux当中,所有用户都要隶属于某一个组,哪怕这个组只有你一个人(此时该组就以你的用户名为组名)。
1)那么组的概念是什么?
在某个公司当中有两个小组团队(A组、B组)在同一个Linux服务器上进行着同一款项目的开发(赛马模式),而你就是A组当中的一员。
如果没有所属组的概念,那么当你创建了一个文件后,要么就是只有你自己(拥有者)能看到,要么就是其他人(other)也都能看到。而你所希望的是你自己和你的小组成员能看到,剩下的人看不到。
于是就有了所属组这个概念,这时你就可以将文件设置为拥有者和所属组可见,而other不可见。所以所属组的存在是为了更灵活的进行权限配置,满足团队协作。
我们可以通过指令ll来查看某一文件或文件目录的拥有者和所属组。
敲黑板:除了文件拥有者和文件所属组之外的都叫other。
2)文件类型和访问权限
权限涉及到某个具体的事物来说,我们还需要讨论事物本身的属性。对于文件来说,我们应该讨论其文件类型,以及是否具有可读、可写和可执行的属性。
敲黑板:不同的字符代表不同的文件类型。
1)-:代表普通文件。
2)d:代表目录。
3)l:代表链接文件(类似于Windows当中的快捷方式)。
4)b:代表块设备文件(例如硬盘、光驱等)。
5)p:管道文件。
6)c:字符设备文件。
7)s:套接口文件。在Linux当中,文件类型与文件后缀无关。
剩下的9个字符每三个为一组,分别代表该文件相对于其拥有者、所属组以及other是否拥有某种属性。
每一组的三个字符的第一个字符代表该文件是否具有可读属性,第二个代表是否具有可写属性,第三个代表是否具有可执行属性。
现在我们来阐述一下该文件的类型以及权限。
001.text文件是一个普通文件,该文件的拥有者是可读可写的,但该文件的所属组和other对其只有读的权力。
3)文件权限值的表示方法
a)字符表示方法
字符表示法 | 说明 |
---|---|
r - - | 仅可读 |
- w - | 仅可写 |
- - x | 仅可执行 |
r w - | 可读可写 |
r - x | 可读可执行 |
- w x | 可写可执行 |
r w x | 可读可写可执行 |
- - - | 无权限 |
b)八进制数值表示法
字符表示法中的每一个字符所在位置所表示的结果只有两种可能,要么为真,要么为假,因此我们可以将这三个字符换为三个二进制位,进而换为一个八进制位进行表示。例如
字符表示法 | 二进制 | 八进制数值表示法 | 说明 |
---|---|---|---|
r - - | 100 | 4 | 仅可读 |
- w - | 010 | 2 | 仅可写 |
- - x | 001 | 1 | 仅可执行 |
r w - | 110 | 6 | 可读可写 |
r - x | 101 | 5 | 可读可执行 |
- w x | 011 | 3 | 可写可执行 |
r w x | 111 | 7 | 可读可写可执行 |
- - - | 000 | 0 | 无权限 |
4)文件访问权限的相关设置方法
a)如何改变文件的访问权限
语法: chmod 选项 权限 文件名或目录名
功能: 设置文件的访问权限。
常用选项: -R 递归修改目录文件的权限。
chmod指令权限值的格式:
格式一: 用户符号 +/-/= 权限字符
1)+:向权限范围增加权限代号所表示的权限。
2)-:向权限范围取消权限代号所表示的权限。
3)=:向权限范围赋予权限代号所表示的权限。
用户符号:
1)u:拥有者。
2)g:所属组。
3)o:other。
4)a:所有用户。
若要同时设置不同类用户的访问权限,则需用逗号隔开。
格式二: 三位八进制数字
将对应的八进制数转换为二进制,进而设置对应权限值。(664的二进制:110110100)
b)如何改变文件的拥有者
语法: chown 选项 用户名 文件名或目录名
功能: 修改文件的拥有者。
常用选项: -R 递归修改目录文件的拥有者。
敲黑板:如果是普通用户还需要sudo提权
也可以使用chown指令同时修改文件的拥有者和所属组,将拥有者和所属组的用户名用冒号隔开即可。
c)如何改变文件的所属组
语法: chgrp 选项 用户名 文件名或目录名
功能: 修改文件的所属组。
常用选项: -R 递归修改目录文件的所属组。
敲黑板:普通用户修改文件的所属组也需要进行权限提升。
d)如何修改文件的掩码
我们查看新建的文件和目录,它们都有自己默认的权限。
实际上,新建文件的默认权限为0666,新建目录的默认权限为0777。其中第一位的0与特殊权限有关,我们这里不必深究,而后面三位就是权限的八进制数值表示方法,我们将其翻译为字符表示方法。
但实际上你会发现,你所创建出来的文件和目录的权限值往往不是我们所翻译出来的值,原因就是创建文件和目录的时候还要受到umask的影响,假设默认权限是mask,则实际创建出来的文件权限是:mask&(~umask)
语法: umask 权限值
功能: 查看或修改文件掩码。
我们可以通过指令umask查看文件默认掩码。
因此我们实际创建出来的文件和目录的权限值还需要进行进一步换算才能得出。首先我们将掩码的的后三位八进制换算为二进制,然后对其进行按位取反。
然后将之前的新建文件的默认权限值和新建目录的默认权限值分别与其进行按位与操作,得到的就是我们创建出来的文件和目录的权限值。也可以理解为凡是在umask中出现的权限位,都不能在最终权限中出现。
因此我们也可以通过修改umask来设置文件的访问权限。
设置掩码为000,显示的就是文件的默认权限了。
设置掩码为777,创建出来的文件就没有权限了。
敲黑板: 超级用户的默认掩码为0022,普通用户的默认掩码为0002。
5)目录的权限
对于文件来说,其可读可写可执行的属性我们都知道分别代表着什么对应的操作,那对于目录来说可读可写可执行又分别代表着什么呢?
1)可读权限: 如果用户没有该目录的可读权限,则无法通过ls指令查看目录中的文件内容。
2)可写权限: 如果用户没有该目录的可写权限,则无法通过一系列指令在目录中创建文件或删除文件。
3)可执行权限: 如果用户没有该目录的可执行权限,则无法通过cd指令进入到目录当中。
那么这就会出现一个问题:
只要用户拥有某目录的可写权限,就可以删除该目录当中的文件,而不论该用户是否拥有该文件的可写权限,这显然是不合理的。
为了解决这个不合理的问题,Linux引入了粘滞位的概念。
粘滞位
语法: chmod +t 目录名
功能: 给目录加上粘滞位。
当一个用户将某一个目录加上粘滞位后,该目录的权限值的最后一位变为字符“t”。
此时另一个用户就算有该目录的可写权限,也无法删除该目录下的文件。
敲黑板:
当一个目录被设置为粘滞位,则该目录下的文件只能由:
1)超级用户删除。
2)该目录的拥有者删除。
3)该文件的拥有者删除。
注意: 虽然目录被加上了粘滞位,但如果用户有该目录的可写权限,则不影响其在该目录下创建文件