现在我们知道了Linux系统内文件的三种身份(拥有者、用户组与其他人),知道每种身份都有三种权限(rwx),也知道能够使用chown、chgrp、chmod修改这些权限与属性,当然,利用IS-l去查看文件也没问题。
前面也谈到了这些文件权限对于数据安全的重要性。那么,这些文件权限对于一般文件与目录文件有何不同呢?有大大的不同。
1.权限对文件的重要性
文件是实际含有数据的地方,包括一般文本文件、数据库文件、二进制可执行文件(binary
program)等。
因此,权限对于文件来说,它的意义是这样的:
- r(read):可读取此文件的实际内容,如读取文本文件的文字内容等;
- w(write):可以编辑、新增或是修改该文件的内容(但不含删除该文件);
- ×(execute):该文件具有可以被系统执行的权限。
那个可读(r)代表读取文件内容是还好了解,那么可执行(x)?
这里你就必须要小心。因为在Windows下面一个文件是否具有执行的能力是借由扩展名来判断的,例如:exe、.bat、.com等,但是在Linux下面,我们的文件是否能被执行,则是借由是否具有【x】这个权限来决定,跟文件名是没有绝对的关系的。
至于最后一个w这个权限?当你对一个文件具有w权限时,你可以具有写入、编辑、新增、修改文件内容的权限,但并不具备有删除该文件本身的权限。对于文件的rwx来说,主要都是针对文件的内容而言,与文件名的存在与否没有关系,因为文件记录的是实际的数据嘛。
2.权限对目录的重要性
文件是存放实际数据的所在,那么目录主要是存储什么?
目录主要的内容在记录文件名列表,文件名与目录有强烈的关联。所以如果是针对目录时,那个r、w、x对目录是什么意义呢?
- r( read contents in directory)
表示具有读取目录结构列表的权限,所以当你具有读取(r)一个目录的权限时,表示你可以查询该目录下的文件名数据,所以你就可以利用Is这个命令将该目录的内容列表显示出来。
- w( modify contents of directory )
这个可写入的权限对目录来说,是很了不起的,因为它表示你具有改动该目录结构列表的权限,也就是下面这些权限:
- 建立新的文件与目录;
- 删除已经存在的文件与目录(不论该文件的权限是什么);
- 将已存在的文件或目录进行更名;
- 移动该目录内的文件、目录位置;
总之,目录的w权限就与该目录下面的文件名的变动有关。
- x( access directory)
咦,目录的执行权限有啥用途?目录只是记录文件名而已,总不能拿来执行吧?
没错,目录不可以被执行,目录的x代表的是用户能否进入该目录成为工作目录的用途,所谓的工作目录(work directory)就是你目前所在的目录。
举例来说,当你登录Linux时,你所在的家目录就是你当前的工作目录,而变换目录的命令是【cd】( change directory )。
上面的东西这么说,太枯燥了,有没有清晰一点的说明?好,让我们来思考一下人类社会使用的
东西好了。
现在假设文件是一堆文件盒,所以你可能可以在上面写/改一些数据,而目录是一堆抽屉。因此你可以将文件盒分类放置到不同的抽屉里面,因此抽屉最大的目的是拿出/放入文件盒。现在让我们汇整一下内容:
组件 | 内容 | 替代对象 | r | w | x |
文件 | 详细数据data | 文件夹 | 读到文件内容 | 修改文件内容 | 执行文件内容 |
目录 | 文件名 | 可分类抽屉 | 读到文件名 | 修改文件名 | 进入该目录的权限(key) |
根据上述的分析,你可以看到,对一般文件来说,rwx主要是针对文件的内容来设计权限,对录来说,rwx则是针对目录内的文件名列表来设计权限。
其中最有趣的大概就属目录的x权限了,文件名怎么执行?
没道理嘛。其实这个x权限设计,就相当于该目录——也就是该抽屉的“钥匙”,没有钥匙你怎么能够打开抽屉?对吧!
3.举例说明
大致的目录权限概念是这样,下面我们来看几个范例,让你了解一下啥是目录的权限。
有个目录的权限如下所示:drwxr--r-- 3 root root 4096 Jun 25 08:35 .ssh
系统有个账号名称为vbird,这个账号并没有支持root用户组,请问vbird对这个目录有何权限?是否可切换到此目录中?
答:vbird在这里属于其他人,对此目录仅具有r的权限,因此vbird可以查询此目录下的文件名列表,因为vbird不具有x的权限,亦即vbird没有这个抽屉的钥匙,因此vbird并不能切换到此目录内——即不能打开。(相当重要的概念)
上面这个例题中因为vbird具有r的权限,因为是r乍看之下好像就具有可以进入此目录的权限其实那是错的。能不能进入某一个目录,只与该目录的x权限有关。此外,工作目录对于命令的执行是非常重要的,如果你在某目录下不具有x的权限,那么你就无法切换到该目录下,也就无法执行该目录下的任何命令,即使你具有该目录的r或w的权限。
很多朋友在搭建网站的时候都会卡在一些权限的设置上,它们开放目录数据给因特网的任何人来浏览,却只开放r的权限,如上面的范例所示那样,那样的结果就是导致网站服务器软件无法到该目录下读取文件(最多只能看到文件名),最终用户总是无法正确地查看到文件的内容(显示权限不足)。
要注意:要开放目录给任何人浏览时,应该至少也要给予r及×的权限,但w权限不可随便给,为什么w不能随便给,我们来看下一个例子。
假设有个账号名称为dmtsai,它的家目录在/home/dmtsai/,dmtsai对此目录具有[rwx]的权限。若在此目录下有个名为the_root.data的文件,该文件的权限如下:
-rwx------ 1 root root 4365 Sep 19 23:20 the_root.data
请问dmtsai对此文件的权限是什么?可否删除此文件?
答:如上所示,由于dmtsai 对此文件来说是others的身份,因此这个文件它无法读、无法编辑也无法执行,也就是说,它无法变动这个文件的内容。
但是由于这个文件在它的家目录下,它在此目录下具有rwx的完整权限,因此对于the_root.data这个文件名来说,它是能够删除的。结论就是,dmtsai 这个用户能够删除the_root.data这个文件。
上述的例子解释是这样的,
假设有个莫名其妙的人,拿着一个完全密封的文件盒放到你的办公室抽屉中,因为完全密封你也打不开、看不到这个文件盒的内部数据(对文件来说,你没有权限)。
但是因为这个文件盒是放在你的抽屉中,你当然可以在这个抽屉中拿出/放入任何数据(对目录来说,你具有所有权限)。
所以,情况就是:你打开抽屉、拿出这个没办法看到的文件盒、将它丢到走廊上的垃圾桶,搞定了(顺利删除)。
还是看不太懂?没关系,我们下面就来设计一个练习,让你实际玩玩看,应该就能够比较明白了。不过,由于很多命令我们还没有教,所以下面的命令有的先了解即可,详细的命令用法我们会在后面继续介绍。
- 先用root的身份建立所需要的文件与目录环境
我们用root的身份在所有人都可以工作的/tmp目录中建立一个名为testing的目录,该目录的权限为744且目录拥有者为root。另外,在testing目录下在建立一个空文件,文件名亦为testing。
仔细看一下,目录的权限是744,且所属用户组与使用者均是 root。
那么在这样的情況下面,一般身份使用者对这个目录/文件的权限是什么?
- 一般用户的读写权限是什么?观察中
在上面的例子中,虽然目录是744的权限设置,一般用户应该能有r的权限,但这样的权限用户能做啥事?
由于我的系统中含有一个名为bcq_113的账户,请再开另外一个终端,使用bcq_113登录来操作下面的任务。
虽然有告知权限不足,但因为具有r的权限可以查询文件名,由于权限不足(没有x),所以会有一堆问号。
因为不具有x,所以当然没有进入的权限,有没有联想到前面的权限说明?
- 如果该目录属于用户本身,会有什么状况?
上面的练习我们知道了只有,确实可以让用户读取目录的文件名列表,不过详细的信息却还是读不到,同时也不能将该目录变成工作目录(用cd进入该目录之意)
那如果我们让该目录变成用户的,那么用户在这个目录下面是否能够删除文件?下面的练习做做看:
1.先用root的身份来搞定/tmp/testing的属性、权限设置
2.再用dmtsai的账号来处理一下/tmp/testing/testing这个文件看看。
竟然可以删除,这样理解了吗?
通过上面这个简单的步骤,你就可以清楚地知道,x在目录当中是与能否进入该目录有关,至于那个w则具有相当重要的权限,因为它可以让用户删除、更新、新建文件或目录,是个很重要的参数,这样可以理解了吗?
3.1.用户操作功能与权限
刚刚讲这样如果你还是搞不懂,没关系,我们来处理个特殊的案例。假设两个文件名,分别是下
面这样:
- /dir1/file1
- /dir2
假设你现在在系统使用bcq_113这个账号,那么这个账号针对/dir1、/dir1/file1、/dir2这三个文件名来说,分别需要哪些最小的权限才能完成各项任务?我汇整如下,如果你看得懂,恭喜你,如果你看不懂,没关系,未来再来继续学。
操作 | /dir1 | /dir1/file | /dir2 | 重点 |
读取file1内容 | x | r | - | 要能够进入/dir1才能读到里面的文件数据 |
修改file1内容 | x | rw | - | 要进入/dir1且修改file才行 |
执行file1内容 | x | rx | - | 能够进入/dir1且 file1能运行才行 |
删除file1文件 | wx | - | - | 能够进入/dir1且具有目录修改的权限即可 |
将file1复制到/dir2 | x | r | wx | 要能读file1且能修改/dir2内的数据 |
你可能会问,上面的表格当中,很多时候/dir1都不必有r,为啥?
我们知道/dir1是个目录,也是个抽屉。那个抽屉的r代表“这个抽屉里面有灯光”,所以你能看到的抽屉内的所有文件盒名称(非内容)。
但你已经知道里面的文件盒放在那个地方,那有没有灯光有区别?你还是可以摸黑拿到该文件盒的,对吧!因此,上面很多操作中,你只要具有x即可,r是非必备的,只是没r的话,使用[tab]时,它就无法自动帮你补齐文件名了,这样理解了吗?
看了上面这个表格,你应该会觉得很可怕。因为要读一个文件时,你得要具有这个文件所在目录的x权限才行。所以,通常要开放的目录,至少会具备rx这两个权限,现在你知道为啥了吧!