用户
所谓权限,就是通过一定条件来拦住一部分人,让另外一部分人访问资源的权利。简单来说,就是能与不能的关系。那么毫无疑问,权限会与人有关,我们先来看看Linux中有那些种类的用户。
在Linux中,只存在两种用户:
root
:超级管理员
user
:普通用户
root用户在Linux中几乎无所不能,甚至可以把整个根目录给删掉,因此十分危险。那么我们要如何在Linux中创建普通用户?
创建用户
指令adduser
+用户名,即可创建一个用户:
以上代码就创建了一个名为me
的用户,我们可以到/home
目录下查找当前存在的用户:
随后我们要为这个用户设置密码,指令为passwd
+ 用户名:
随后输入你的密码即可,一般来说Linux会向你确认两次密码。
如果你想要删除一个用户了,则用指令userdel -r
+ 用户名:
此时我们再去/home
目录下查找,就找不到该用户了。这里不要漏掉-r
选项,不然会有用户的残留文件,下次创建相同名字的用户时,有可能就会创建失败了。
创建好用户后,我们要如何进行用户的切换呢?
用户切换
su xxx
变为xxx用户,比如我现在要从root
变为一个名为box-he
的用户:
其中,whoami
指令可以输出当前的用户名。
从以上图片可以看出:
root
用户变为普通用户无需密码root
状态下,命令行末尾是#
;user
状态下,命令行末尾是$
现在再尝试从普通用户变为其它普通用户,我这里从box-he
变为hxy
用户:
可以看到:普通用户变为普通用户,是需要密码的。
那么普通用户可以变成root
用户吗?也是可以的,有两种方式:
指令su
,暂时提升为root
用户:
该方法提升为root
有以下特点:
- 提升为
root
后,工作目录不会改变- 是临时性的提升,可以通过
ctrl + D
退出当前状态
另外一种方式为su -
,该方法则是切换为root
用户:
该方法提升为root
有以下特点:
- 提升为
root
后,工作目录会变成root
的家目录- 是用户的转变,相当于用
root
身份重新登陆了一次
不过Linux的权限远远不止取决于这个用户是谁,在学校中,你可以进入学校的大门,因为你是学校的学生;在餐馆中,你可以享受美食,因为你是消费者;在电视上,你可以跳过广告,因为你是VIP。可见你能不能享受一个服务,并不取决于你是谁,而取决于你在该环境下的身份。
文件的权限
身份
在Linux中,对于任意一个文件,都只有三种身份:拥有者own
,所属组group
,其它other
。而这个身份,我们可以直接通过ll
指令看到:
上图中,第三项和第四项就分别代表拥有者和所属组,即box-he box-he。说明这两个文件的拥有者和所属组都是box-he用户。
那么为什么这个文件没有写other呢?因为除了拥有者和所属组,其他用户的身份都是other。
那么我们要如何对文件的拥有者和所属组进行修改呢?
chown:
chown
指令用于修改文件的拥有者,语法如下:
chown 新拥有者 文件名
该指令需要root
权限才能执行,要么就在root
身份下执行,要么就使用sudo
进行指令提权。
在此,我直接切换为root
进行该操作,接下来我们尝试把test.txt
的拥有者改成root
:
可以看到,test.txt
文件的拥有者变成root
了。
chgrp
chgrp
指令用于修改文件的所属组,语法如下:
chgrp 新所属组 文件名
和chown
相同,该指令需要root
权限才能执行。
接下来我把test.txt
的所属组也改成root
:
这下test.txt
文件的所属组也变成root
了。
那么我们知道了对于一个文件,不同的用户有不同的身份,那么每个身份又有怎样的权限呢?这就和文件的权限值相关了。
权限值
当我们用ll
输出当前目录下的文件信息时,其实就可以看到文件的权限值了:
其中,每个文件前的第一项,就是该文件的权限值。比如test.txt
的权限值为-rw-rw-r--
,testdir
的权限值为drwxxrwxr-x
。
以testdir
为例,一个文件的权限值可以拆为:
第一个字符
d
:表示文件类型第2,3,4个字符
rwx
:表示拥有者的权限
第5,6,7个字符rwx
:表示所属组的权限
第8,9,10个字符
r-x
:表示other
的权限
除了第一个字符表示文件的类型,常见的文件类型及标识符如下:
d
:目录文件-
:普通文件
b
:块设备文件c
:字符设备文件p
:管道文件l
:链接文件
那么我们的testdir
第一个字符为d
,说明该文件是个目录。
剩下的九个字符,每三个为一组,其中字符的含义为:
r
:读取权限w
:写入权限x
:执行权限-
:没有该位置对应的权限
因此drwxxrwxr-x
的意思就是,该文件的拥有者可以读,写,执行;该文件的所属组可以读,写,执行;该文件的other
可以读,执行,但是不能写入。
比如以下文件test.txt
的权限为rwx------
,拥有者和所属组都是root
,当前用户是box-he
:
可以看到,我们不能通过echo
向文件写入,不能通过cat
读取文件,也不能执行文件。
我们再看到以下情况:
现在test.txt
的拥有者和所属组都是box-he
,但是拥有者的权限是---
,所属组的权限是rwx
,那么box-he
能不能对该文件操作呢?
可以看到,box-he不享有该文件的读写权限。可是box-he明明是该文件的所属组,虽然拥有者的权限是---,但是所属组的权限是rwx,为啥box-he用户无法享有该权限呢?
一个用户的权限只从左向右匹配一次,当一个用户被匹配为了拥有者,那么他就只享有拥有者的权利,而不享有所属组的权利
因此,box-he
虽然是所属组,但是由于先匹配到了拥有者,最后就只有拥有者的权限了。
目录的权限
对于目录而言,其权限和普通文件还是有所区别的。
从上图中可见,不论是目录还是文件,都是用rwx
来表示权限值的。但是目录的rwx
的含义略有不同:
r
:决定用户能否查看目录内容w
:决定用户能否在目录中创建,修改,删除文件x
:决定用户能不能进入目录
现在我们有以下目录文件testdir
:
testsdir
的拥有者为root
,所属组为box-he
,但是box-he
所在的所属组的权限为---
。接下来我们尝试以box-he
的身份来执行进入目录,查看目录的操作:
可以看到,两者都被拒绝了,接下来我们打开r
权限与x
权限:
现在我们就可以正常的进入以及查看目录了,但是我们现在还不能在目录里面删除与创建文件,这涉及到目录的w
权限:
现在我们把testdir
的权限改为rwxrwx---
,这样box-he
就可以在内部增删文件了:
我们再看看tetsdir
内部都有啥文件:
在testdir
内部,有三个文件,这三个文件的拥有者都是root
,权限都是rw-------
,也就是说当前box-he
对这些文件没有任何权限。但是别忘了,只要一个用户有目录的w
权限,那么就可以删除目录里面的文件,我们看看box-he
能不能把这三个文件删掉:
我们居然可以把一个完全没有任何权限的文件给删掉,甚至这个文件属于root
!
删除一个文件,与用户也没有这个文件的权限无关,只和这个用户有没有该目录的
w
权限有关
权限的修改
讲了这么久文件的权限,那么我们要如何修改一个文件的权限呢?
chmod指令
chmod
指令用于修改文件的权限值。
语法:
chmod [选项] 权限 文件名
注意:只有文件的拥有者和root
可以修改文件的权限
对于chmod
指令,其通过+
,-
,=
来进行修改,通过用户符号来表示对哪一个用户操作:
u
:拥有者user
g
:所属组group
o
:其他用户other
a
:所有用户all
比如以下语法:
chmod u+r test.txt
给test.txt
的user
增加r
权限
chmod o-w test.txt
给test.txt
的other
删除w
权限
chmod g+rx test.txt
给test.txt
的group
增加rx
权限
chmod a=rwx test.txt
test.txt的所有用户的权限变成rwx
另外的,文件的权限值还支持八进制格式,比如rwxr-x---,可以把每一个权限值视为一个比特位,该位权限有就是1,没有就是0。因此该权限值二进制可以写为111101000,再转化为八进制就是750。
chmod指令还支持八进制形式的修改
语法:
chmod [选项] 八进制值 文件名
比如有以下文件:
那么我们chmod 777 test1.txt
,就是把test1.txt
的权限值设置为777
,二进制对应111111111
,也就是rwxrwxrwx
。看看效果:
对应的文件就是rwxrwxrwx
了。
umask指令
讲解umask
指令之前,我们看到一个问题,文件和目录的默认权限值是什么?
我创建一个文件和目录来试验一下:
可以看到,这里目录的默认权限值为rwxrwxr-x
,而普通文件的默认权限值是rw-rw-r--
。
但是你的Linux的默认权限有可能与我不同,这是因为权限的默认设置是会受到权限掩码
的影响的,每个人的权限掩码有可能不同。
首先,文件与目录是有起始权限的:
普通文件的起始权限是0666
,也就是rw-rw-rw-
目录文件的起始权限是
0777
,也就是rwxrwxrwx
我们可以直接输入指令umask
查看当前权限掩码:
我这台主机当前的权限掩码为0002
,去掉第一位,后三位的二进制就是000 000 010
。那么权限掩码是如何生效的呢?
算法如下:
最终权限 = 起始权限 & ( ˜umask)
也就是先对权限掩码umask取反,然后再让起始权限与其按位与操作。
比如目录的起始权限为111111111,我的umask为0002,也就是000000010。~umask等于111111101,与起始权限111111111进行按位与得到111111101。因此我最后创建一个目录的默认权限为rwxrwxr-x。
这个权限掩码也可以直接修改,chmod xxx就可以把权限掩码修改为xxx。
这个权限掩码也可以直接修改,chmod xxx
就可以把权限掩码修改为xxx
。
粘滞位
现在来想一个问题,如果我们想要创建一个目录,让多个人在内部进行合作交流。互相可以翻阅文件,也可以在目录内部自由创建文件,应该怎么做?
先创建一个目录:
这个目录tmp
就是后续大家相互交流的文件,现在我们希望所有的other
都可以在内部创建文件,互相浏览文件,进行交流,那么我们就要开放该目录的w
权限:
但是开放了w
权限有一个问题,那就是大家不仅可以在目录内部自由创建文件,还可以自由删除文件!!
这就会导致,一个用户可以删除别人的文件,但是我们只希望互相之间可以查阅文件,以及自由创建文件。以我们目前学习的权限知识,没有办法处理这个问题。
Linux为此特别制定了一个粘滞位
权限t
,其用于替代x
权限,t
权限的规则如下:
- 一个文件只能被
root
,目录所有者
,文件所有者
删除
我们可以直接通过chmod
增加该权限:
那么对于这个tmp
目录内部的文件,就只有root
可以删除,文件所有者可以删除,目录所有者可以删除了。这样各个other
之间,就不能互删文件了,但是由于目录的w
权限开放,大家依然可以自由创建文件。