对于刚接触Linux的朋友,经常会碰到一些"permission denied"问题。明明看的懂英文意思是说没有权限,但却摸不着头脑:为啥是没权限的?怎么改权限?
本文对linux的权限管理做了通俗易懂的介绍,看完一定会对你有所帮助!
浏览权限
使用ls -al
命令可以查看当前目录下的所有文件信息:
[root@localhost ~]# ls -al
总用量 28
dr-xr-x---. 2 root root 135 10月 21 21:13 .
dr-xr-xr-x. 17 root root 224 10月 20 06:26 ..
-rw-------. 1 root root 1257 10月 20 07:01 anaconda-ks.cfg
-rw-------. 1 root root 156 11月 25 14:44 .bash_history
-rw-r--r--. 1 root root 18 12月 29 2013 .bash_logout
-rw-r--r--. 1 root root 176 12月 29 2013 .bash_profile
-rw-r--r--. 1 root root 176 12月 29 2013 .bashrc
-rw-r--r--. 1 root root 100 12月 29 2013 .cshrc
-rw-r--r--. 1 root root 129 12月 29 2013 .tcshrc
这里面列出了当前目录下所有文件(包含当前目录本身.
,当前目录所属的父目录..
,当前目录下的目录,以及当前目录下的隐藏文件即文件名前有一个.
的文件)的权限,名称,属性等信息。其中每一列的大致含义如下:
第一列就是我们要的文件权限信息。它由10个字符组成:
- 第一个字符
-
代表该文件的类型。-
表示该文件是一个普通文件,如果是d
则表示其是一个目录。还有其他几种文件类型如l
,b
等本文就不介绍了,有兴趣可以自行去查阅 - 从第二个字符开始到最后一个字符共九个字符按顺序分为三组,分别表示文件拥有者的权限类型,文件所属群组的权限类型,以及文件所属群组之外的其他用户的权限类型:
其中每组权限都由3个字符组成,分别表示读取权限,写入/修改权限,执行权限。即从左到右若第一个字符为
r
表示有读取权限,若第二个字符为w
表示有写入/修改权限,若第三个字符为x
则表示有执行权限,而若出现字符为-
则表示没有对应的权限。因此上图中表示的权限信息为:对于该文件,文件拥有者有读/写权限,而文件所属群组的其他成员以及群组外的其他用户都只有读取权限
文件与目录权限的区别
正如前面所说,当我们用ls -al
命令列出文件信息时可以看到目录和文件都有一样的权限类型展示,这里需要注意r
w
和x
(即读取,写入,执行)针对文件和目录表示的含义是不同的。
对于文件来说,有读取权限表示可以查看的内容,有写入权限表示可以对文件的内容修改(包括清空,修改,添加内容,但不能删除文件),有执行权限表示可以执行该文件(但是具体执行成不成功又文件内容决定)。
对于目录来说,有读取权限表示可以查看该目录下的文件名列表(但不一定能读取目录下文件内容),有写入权限表示可以对目录的结构修改(修改目录名,删除或创建文件等,但不能修改文件内容),有执行权限表示可以进入该目录。
直观的用表格对比如下:
读取(r) | 写入(w) | 执行(x) | |
---|---|---|---|
文件 | 查看文件内容 | 修改文件内容 | 执行文件 |
目录 | 查看目录文件列表 | 删除创建目录下文件 | 进入目录 |
用户与群组
现在我们知道了怎么查看一个文件的权限信息,并且知道一个文件包含了三组权限(文件拥有者的权限,文件所属群组的权限,群组外其他用户的权限)。这三组权限有什么区别呢?在什么时候应该看哪组权限?要解决这个问题我们就需要先了解用户与群组
为什么会有多用户?
我们大部分人都拥有自己的个人电脑,不管是台式机也好,笔记本也好,基本都是自己在用,也就是通常只有‘自己’这么一个用户。但实际上我们的操作系统通常都是能够支持多个用户一起使用的,Linux作为一个多用户多任务的系统,常常会有多人同时使用这台机器工作。考虑到每个人在工作中的职能角色不同,需要对每个人的资源做隐私保护,以及支持个人拥有自己喜好的工作环境,多用户就起了非常大的作用。
为什么会有多群组?
群组的主要功能就是为团队划分资源。想象一下你的公司有高层管理也有普通员工都会用到同一台机器工作,这台机器上放着公司的一些机密文件,这些机密文件只有高层管理才能查阅,而普通员工不允许查看,群组正好解决了这样的问题。我们可以把高层管理用户放在‘领导’群组中,普通员工都归到‘普通员工’群组中,并将机密文件的权限只对‘领导’群组开放,这样就能通过限制权限为不同群组的用户划分资源。
修改文件属性与权限
为了演示,首先使用touch
命令在当前目录创建一个空文件,并用ls -l
命令查看该文件等属性及权限:
[root@localhost ~]# touch test
[root@localhost ~]# ls -l test
-rw-r--r--. 1 root root 0 11月 25 19:59 test
可以看到test文件等拥有者是root,对其他用户只有读取权限。这里要特别说明,由于root账户是拥有最高管理权限的超级管理员账户,因此即使文件拥有者的权限显示为rw-
(读取和写入),但对于root账户其实都有着全部rwx
权限。
修改文件拥有者
使用chown
命令可以修改文件拥有者:
[root@localhost ~]# chown yousiku test
[root@localhost ~]# ls -l test
-rw-r--r--. 1 yousiku root 0 11月 25 19:59 test
这里我将test文件拥有者改为我的另一个账户yousiku
,大家在对照演示时需注意将账户名换成自己的账户。
修改文件所属群组
使用chgrp
命令修改文件所属群组:
[root@localhost ~]# chgrp yousiku test
[root@localhost ~]# ls -l test
-rw-r--r--. 1 yousiku yousiku 0 11月 25 19:59 test
同样的需注意将群组名换为自己的。
修改文件权限
使用chmod
命令修改文件权限,该命令支持两种方式修改:数字参数方式和字符参数方式
数字参数方式修改文件权限
我们现在已经知道,文件的权限由9个字符表示,如rw-r--r--
,而这9个字符又可以分为三组分别表示文件拥有者,文件所属群组及其他用户的权限。现在我们要将每个字符都转化成一个数值,并将一组数值相加得到一个数字来表示一组权限,各字符对应值如下:
r | w | x | - |
---|---|---|---|
4 | 2 | 1 | 0 |
因此,rw-r--r--
可以表示为644,因为第一组rw-
对应的数值分别为4,2,0,相加为6;第二组r--
对应属之分别为4,0,0,相加为4,第三组同第二组,因此最终表示结果为644。
所以,如果我们想将该文件的权限改为rwxrw-rw-
,则应先算出表示该权限的数字为766,然后使用chmod
命令:
[root@localhost ~]# chmod 766 test
[root@localhost ~]# ls -l test
-rwxrw-rw-. 1 yousiku yousiku 0 11月 25 19:59 test
这样就成功将该文件权限改写为拥有者有全部权限,其他用户都有读取和写入权限了。
字符参数修改文件权限
字符参数修改权限采用“给用户类型赋值”的方式,如,想要将文件拥有者的权限设为读取和写入,则采用字符参数u=rw
;若想在修改拥有者权限的同时修改群组的权限为读取和执行,则采用字符参数u=rw,g=rx
:
[root@localhost ~]# chmod u=rw,g=rx test
[root@localhost ~]# ls -l test
-rw-r-xrw-. 1 yousiku yousiku 0 11月 25 19:59 test
这里的u表示文件拥有者(user),g表示群组(group),需注意字符参数里不能含有空格。用户类型共有四种:
- u (user) 文件拥有者
- g (group) 文件所属群组
- o (others) 其他用户
- a (all) 所有用户
除了用=
直接给用户类型赋值权限外,还可以使用+
或-
给用户类型追加或减少权限:
[root@localhost ~]# ls -l test
-rw-r-xrw-. 1 yousiku yousiku 0 11月 25 19:59 test
[root@localhost ~]# chmod u+x,o-w test
[root@localhost ~]# ls -l test
-rwxr-xr--. 1 yousiku yousiku 0 11月 25 19:59 test
可以看到对文件拥有者追加了执行权限,对其他用户减少了写入权限
思维导图
至此,相信你已经对Linux的文件权限管理有了一定的理解,最后附上本文思维导图帮助整理知识结构: