“权限”这个概念在我们的生活中随处可见,它可以约束某个人是否能做某件事。在操作系统中,这个概念同样重要,本文将介绍Linux下权限的概念以及相关操作。
目录
Linux下的两种用户
一、root用户:超级管理员,具有非常高的权限,可以在Linux系统下做任何事情,不受限制。
二、普通用户:只具有一般权限,需要受到权限的约束。
注:root用户与普通用户的密码尽量不要设置成一样的,防止权限界限模糊。
下面介绍一下Linux下关于用户切换的指令。
su - [用户名]:若需要从root用户切换到普通用户,则使用su - user。若要从普通用户user切换到root用户则需要使用su - root(root可以省略),此时系统会提示输入root用户的密码。
如下,首先输入指令whoami得知此时的用户为普通用户。
接着就可以使用指令切换为root用户。
此时切换已经完成,如果想进行用户回退,推荐使用exit指令或ctrl+d快捷键,而不要出现类似su - hyh类的指令(即不要连续使用用户切换指令),原因如下:
首先在root用户下使用指令ps axj | grep bash查看服务进程
可以看到此时存在两个bash,此时继续使用su - 指令切换用户
继续使用使用指令ps axj | grep bash查看服务进程
此时又多出了一个bash进程,因此我们可以得知每次切换用户,系统都会为我们创建一个bash,这是不合理的(想想看如果出现上百个bash回出现什么样的情况)。
而使用exit或ctrl + d则可以避免该情况。在刚刚已经具有三个bash的情况下,使用exit指令进行回退,接着调用指令ps axj | grep bash
可以看到此时又只剩下了两个bash,即回退之前那个用户所对应的bash也被终止了。
另外还有一个常用指令sudo:
sudo的作用是临时的权限提升,如果执行某条指令的权限不够,可以使用sudo+该指令的形式临时提升权限,执行该指令。使用sudo后需要输入本次登入的普通用户的密码。
如下:如果想以root用户的身份创建一个test文件,则可以在命令前面加上sudo
注意:该指令无法直接使用,需要提前添加好信任关系才可以使用。
Linux权限管理
什么是权限,权限就是特定的人是否能做特定的事情,即权限 = 人 + 事物属性。下面将分别从人和事物属性两个角度来介绍一下Linux下的权限。
一、Linux下的三类文件访问者
1、拥有者
顾名思义,一个文件归谁所有,这个用户就是该文件的拥有者。
2、所属组
对于这个概念,有人可能会问,既然已经有拥有者的存在了,所属组又是怎么一回事呢?下面举一个场景来描述一下它的作用:
在某个公司的某个部门,存在两个小组,分别称为A组和B组,但是它们只有一台服务器。A组的张三在服务器上上传了代码,他不希望自己的代码被B组的李四所看到,这很简单,只要拥有者之外的人对这段代码没有读的权限不就可以了吗。但问题是张三的代码还需要给A组的同事审查,这就犯难了。此时所属组的作用就出现了,可以设置一个所属组,对组内所有成员设置读的权限即可。
3、其他
拥有者和所属组之外的用户就归为其他了。
下面使用ll指令查看文件夹下文件的属性:
红框的那栏就是拥有者,蓝框那栏为所属组,自然,它两之外的用户就是其它用户了。但是为什么一个文件的拥有者和所属组是一样的呢?这种情况当然允许,因为一个小组的成员可能就只有一个。
二、文件类型和访问权限
我们使用ll查看文件属性,第一栏是由十个字符所组成的,它们分别都表示什么呢?
权限的第1位表示文件类型,Linux下文件类型如下:
d | 文件夹 |
- | 普通文件 |
l | 软链接 |
b | 块设备文件 |
p | 管道文件 |
c | 字符设备文件 |
s | 套接口文件 |
注:Linux不以文件后缀作为文件类型的标识,Linux系统下一切皆文件
后9位中每3为约束一类操作者的权限,约束的操作者从左向右依次为拥有者、所属组、其他。
每3位约束字符从左到右分别表示读、写、执行权限。r(可读)、w(可写)、x(可执行)。
三、权限管理指令
(1)chmod:
功能:设置文件的访问权限
使用方法:
①chmod 用户表示符+/-权限字符 文件名
用户表示符:u(拥有者)、g(所有组)、o(其他)、a(所有用户)
权限字符:即r、w、x
使用时首先如下图test2,对于拥有者没有可执行权限
使用指令chmod u+x test2.txt
此时test2.txt就已经具备了可执行权限x
②chmod 三位8进制数 文件名
在谈具体的使用方法前,先来解释一下为什么可以用三位8进制数来设置权限。如上test2.txt的权限:rwxrw-r--,每三位表示对于一类用户的权限,而对于的权限只有具备/不具备两种可能,因此我们可以将其每位换成二进制表示,即111110100,每三位又可以换算成一个八进制数,即764。因此,我们就可以用764来表示权限rwxrw-r--了。
若想再将test2.txt的权限设置为rw-rw-rw-,只需要使用指令chmod 666 test2.txt
注:1.只有文件所有者能改变改文件的权限(root用户除外)
2.可以一次对多个文件的权限进行修改,只需要用‘,’隔开即可
(2)chown:
功能:修改文件的拥有者
使用方法:chown 用户名 文件名
原本文件test2.txt属于普通用户
现在希望把test2.txt丢给root用户,只需要输入指令chown root test2.txt
但此时却出乎意料的禁止这样做。其实原因也很简单,你想把一样东西给别人,是想给就能给的吗?需要征得对方的同意。这里也是类似,文件的拥有者不是想改就能改的。一般需要root用户来使用chown操作,也可以配合sudo来使用。这里重新输入指令sudo chown root test2.txt
此时test2.txt的拥有者就被修改成了root
(2)chgrp:
功能:修改文件的拥有者
使用方法:chgrp 所属组名 文件名
使用时与chown类似,test3.txt文件的所属组原本为hyh
使用指令sudo chgrp root test3.txt
此时test3.txt的所属组就被修改成了root
其实chown也可以同时改变文件的拥有者和所属组,对于test1文件,使用如下指令sudo hyh:hyh test1.txt
test1.txt的拥有者和所属组被同时改为了普通用户
四、目录的权限
对于目录RootDir,我们可以进入这个目录,也可以查看目录中的文件,还可以在目录中增加或删除文件。那么这些操作分别需要什么权限呢?
进入目录需要的权限为x,查看目录中的文件需要权限r,而在文件中增加和删除文件则需要权限w。
五、粘滞位
在实际使用中,我们可能会遇到这样的问题:张三创建了一个目录dir,张三希望李四能够在dir中添加文件,因此dir对李四设置了写权限。但问题也来了,dir下如果也有张三的文件,李四是否能将此删除呢?这是不合理的,下面来测试一下。
other对于目录RootDir具有写权限,使用普通用户进行操作
目录中有root创建的文件test
作为普通用户直接使用rm -r test.txt
结果test.txt真的被删除了。由此可见,即便不是文件的拥有者,只要用户对于该层文件具有写权限,就可以删除目录中的任何文件。
如果我们希望其他用户只能在文件夹下创建文件和删除自己文件,而不能删除别人的文件,这应该这么办呢?为了解决这个问题,粘滞位蕴育而出。
但一个目录被设置为粘滞位,则该目录下的文件只能由超级管理员root、该目录的所有者、该文件的所有者删除。
使用方法:chmod o+t 文件夹名
接着进入目录,再试着删除root所创建的文件
可以看到我们此时已经不具备了删除的权限。而增加文件不会受到影响。
六、文件的默认权限
我们创建一个文件,对于普通文件,默认权限为666;对于目录文件,默认权限为777。但实际并非如此,这是怎么回事呢?我们以普通用户创建一个普通文件的权限通常为664,而非666。产生这种现象的原因是由于权限掩码,我们可以使用umask来查看权限掩码:
可以看到这里的权限掩码为002,第一位的0不需要关注。转为9位二进制即为000000010,即把umask对于位为1的默认设置为0。如666的9位二进制位110110110,此时就变成了110110100,即我们看到的664。最终的权限可以通过将umask按位取反再和默认权限按位与获得。