在linux下命令窗口中,我们会经常用 ll(也就是ls -al的缩写) 来查看某个目录下的一些文件或目录权限,而 ll 指令显示出权限都是以rwx形式解释的,现在通过下面几个实验来彻底搞清一下这个rwx对文件和目录的意义。
这里说明一下我的linux版本是ubuntu13.10,进行实验的账户有2个,一个是系统账户root,一个是一般账户qw4990。
开始之前先对 ll 出来内容做一些解释,先看下面这个图
第一行是我下达的指令,直接看第二、三行
我们先将每一行按照空格分成9个字段
如第二行就可以分层这样
1:drwxr-xr-x
2:2
3:root
4:root
5:4096
6:2月
7:18
8:13:58
9:dir/
其中字段1就表示的是权限,字段3表示是此文件或目录的所有者,字段4表示的是此文件或目录的所属群组,字段9表示的是此文件或目录的名字。
其他字段和本次实验无关,就不解释了。
关于字段3和4,这里有一个概念要提及,就是linux下的每个文件或目录都有一个所有者和所属群组。更具体的解释和这么设计的意义大家可以看这里 http://vbird.dic.ksu.edu.tw/linux_basic/0210filepermission_1.php :)
接着我们重点解释字段1
我们先将字段1分成4个部分,按照如下规则,
部分1:第一个字符
部分2:第2、3、4字符
部分3:第5、6、7字符
部分4:第8、9、10字符
于是第二行的字段一就被划分为了 d rwx r-x r-x 这4个部分:)
现在我们分别解释各个部分的意义~~
部分1表示的是此文件的类型,d表示其是目录(如第二行,表示dir就是一个目录),而-(减号)就表示是一般文件(如第三行,表示file为一个一般文件),当然这个部分还有其他的符号,表示其他的文件类型,不过这里我们只讨论目录和一般文件 :)
部分2表示的是此文件所属者对这个文件的权限,所属者是谁呢?就是字段3表示的账户喽~ 部分2由3个字符组成,每个字符都代表一种权限。
r:表示的是读取权限
w:表示的是写入权限
x:表示的是执行权限
比如上面的rwx,就表示dir的所属者(就是root喽)对dir有 读取,写入,执行的权限
当然还有-(减号),-在哪一位上,就表示没有对应那一位的权限~~
举个例子,假如上面部分2的权限不是rwx,是r-x,那就表示所属者对dir有 读取,执行的权限,没有写入的权限;如果极端一点,部分2为---,就表示所属者对dir什么权限都没有~~~
部分3表示的是此文件的所属群组的成员的这个文件的权限,所属群组就是字段4表示的群组。而组成部分3的字符含义和部分2含义一样。
部分4表示的是其他人对这个文件的权限,其他人就表示既不是此文件所属者,也不是其所属群组成员的账户。组成部分4的3个字符含义和部分2含义一样。
预备工作完成了,也基本了解rwx了,现在我们进行下面几个实验深入理解一下其含义。
====================================================================================================================================
首先要明白的是同样的rwx对文件和目录的意义是不一样的!
文件
首先来看看文件的权限是怎么样的。
我们先用系统账户在/home/qw4990下建立一个文件file,并且在里面输入"this is file",权限设定如下图,所属群组和所有者都设定为root
现在我们将账户切回普通账户(我这里用的是qw4990)
然后尝试读取或者写入一下这个文件(因为file的群组和所属者是root,而我的qw4990账户不属于root群组,所以qw4990对于file的权限只包含字段1的第四部分,在这里也就是 --- )
就出现了权限不够的提示。
那我们尝试一下用ll查看文件的基本信息或者删除文件呢?
首先用ll是可以查看到了文件的基本信息。
然后用rm也删除掉了file!!!
所以这里有一点非常重要,一个文件能否被删除和文件的基本查看与其本身的rwx权限无关!!与什么有关往下面看就知道了:)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
接着我们用给访问file的其他人加上可读的权限
再用qw4990尝试读写它!
发现能够读出file,而对于写入,依旧失败。
可见r对于文件的意义也就是让访问者可以查看文件的内容,而不能修改!
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
然后我们吧file的可读权限变为可写权限
再用qw4990尝试读写它!
发现读取文件失败,而写入没提示失败,我们再用root账户读取file试试是否真的写入进去!
可见写入是成功的!
总结一下w对文件的含义,也就是能够让使用者修改文件内的内容!
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
这个exe是我用其他工具写的一个程序~
可以发现他的权限x都是打开的!
我们可以执行一下他 输入 ./exe 就将它执行了,而下面的Hello!就是执行的结果。
接下来我们再用刚才的file试试,给他加上x的权限
给file加上x后,我们尝试运行它,得到了 “hahaha:未找到命令的 ” 提示,而hahaha就是我们刚才给file输入的内容。
怎么解释这个结果呢?
那就是其实当我们输入./file的时候,系统就开始尝试执行file,但是因为file内的内容不符合执行的规则,所以得到了上面的提示。
总之系统是运行了file了,虽然运行失败了:)
接下来我们给file换个内容试试
我们在file中输入一条指令,让后执行file,得到的结果就是file内指令执行的结果!这下是能够实实在在的说明file被执行了吧:)
最后再做一个对比实验,不改变file的内容,给file取消x权限,然后运行试试
出现了权限不够的提示:)
现在用一句话再总结一下x权限对文件的作用:决定文件能否被执行!
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
权限能否组合?~~
直接以下面这个例子来说明,先看图
我用chgrp和chown把file的所属者和群组都改为了qw4990
现在我们再尝试用qw4990去读取一下file。
实验之前先分析一下,
如果从所有者的角度,qw4990能够读取却不能写入;
而从群组的角度,qw4990能够写入却不能读取。
一开始我是猜测qw4990的最终权限是二者的组合,既为 rw- , 但实际结果很有趣 :)
结果如下图
最终的结果是r--,而不是rw-或者-w-!!
由此可见2点,一是linux下的权限是不能够组合的;二是在此冲突的情况下,所属者的优先级大于所属群组!!
===============================================================================================================================
目录
接下来开始说目录~~
从r权限说起! 先文字描述一下r对目录的意义:表示具有读取目录结构列表的权限,所以当你具有读取(r)一个目录的权限时,表示你可以查询该目录下的文件名数据。所以你就可以利用 ls 这个指令将该目录的内容列表显示出来!
建立一个目录,群组和所属者设定为root,权限设定如下,并在里面建立一个文件file(权限对所有人都是rwx)
注意,用ll或者ls查看目录信息时,要加上-d,不然会显示目录内的文件信息!!
接下来我们用qw4990试试在r--权限下能对这个目录干些什么
首先是我尝试进入目录,权限不够,
接着我们用ls显示dir内的文件信息,虽然出现了警告,但是还是吧dir内的文件给我们显示了出来(就是那个file)!
然后我们尝试用ll显示dir内文件更加详细的信息,出现了警告,但是也还是得到了一些结果,虽然不详细(就是那些有问号的地方)!
最后我们尝试读取dir内的那个文件,出现警告,读取失败。
由此总结一下r对目录的含义,它只允许用户初步的查看一下目录内的情况,包含哪些文件、子目录等,就连知道这些文件和子目录的一些详细信息和进入目录都不允许。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
接下来说说x权限,狭隘通俗一点的说:就是决定你能否进入该目录!
我们把刚才那个目录的其他人权限变为--x,再用qw4990试试能干什么
其实可以发现这样的效果很是奇怪 :)
我能够进入目录,也可以对目录内有权限的文件进行相应操作,但是却不能改变目录结构(添加删除文件),甚至不能用ls查看目录结构!!
可见x对目录的意义只是决定你能否进入目录内:)
通过这个实验,还可以解决前面关于文件删除和基本查看的疑问:)
这里因为我们不能更变目录的结构(权限不够),所以不能删除文件!
所以文件能否删除,取决与所在目录的权限:)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
现在说说目录最NB的权限,w权限
还是先用文字说明一下,你拥有w权限,你就具有异动该目录结构的权限,也就是
文字已经说的很清楚了,具体的实验就大家自己试试吧:)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
目录套目录
现在这里又产生了一个问题,
如果有一个目录dir,里面又有一个目录dir0
那么我在dir0下的权限到底应该看dir还是看dir0?
把问题具体一点,现在存在目录dir,它对其他人的权限是rwx,在dir内,又有一个目录,dir0,它对其他人的权限是r-x。
那么当我以其他人的身份进入dir0后,到底能不能建立新的文件?
对于这个问题,还是请大家自己试试:)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
其他问题
首先建立一个母目录,dir,其权限对所有人都为rwx,
然后在dir内建立一个子目录dir0,其权限对所有人都为---,接着在dir内建立一个子目录dir1,其权限对所有人都为rwx,
最后在dir内建一个子文件file0,起权限对所有人都为---。
最后情况是
接着我们在这个基础上进行实验
实验一:对file0进行移动和复制
发现能够进行移动,不能进行复制!!
解释:要复制一个文件,首先就要读取他,而file0没有读取权限,所以复制自然失败。
实验二:对dir0的移动和删除
发现移动dir0失败,而删除dir0却成功了?
虽然我们对dir0没有w权限,不能更改他的目录结构,但是我把他整个移动一下,是没改动其结构的,应该没问题才对?
个人解释:移动dir0真的没有改变它的目录结构么?答案是改变了,因为目录中除了弃应该包含的文件外,还包含另外2个特殊的文件,
一个是象征其自身的 ./
另一个是象征其父亲目录的 ../
我们用dir1来做例子,用ll查看后如下图
看到了吧,绿色的那两部分!!!
那么既然一个目录包含了其父亲目录的基本信息,那你移动他过后,这个文件肯定会发生改变,因此出现了权限问题!
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
总结
要让别人查看你的目录起码要给别人r-x的权限。
对于具体指令所需要的权限,还是要从指令的机制去分析(如cp指令)。
对于目录套目录的情况,实际权限以当前目录为主!