在平时无论是命令行还是UI下操作都会有遇到权限问题,这两周学习shell脚本中也遇到了权限问题。以前都是每次遇到问题,搜答案解决,并没有深究其中含义原理。现在在这里整理一下权限设置方法,以方便大家以后根据自己需要设置权限。
一 chmod 符号模式
下面进入实践阶段:
1 首先我们先看看怎么取消所有用户执行 一个目录下所有文件的权限:
a 代表对所有用户执行此操作
-x 意为取消执行权限
‘*’代表操作对象为该目录下所有文件(注意并不包括子文件夹下的文件)
如果我们对一个文件加下的所有操作执行
2 我们再来看看怎么为在刚才的基础上为文件属主增加执行权限
现在该目录下所有文件的属主都有了执行权限
3 如果我们要为两种用户赋予相同权限呢?
下面我们对同个用户组的用户和其他用户用户取消执行权限,赋予读写权限
针对哪种用户操作,用户名直接补后,操作同类补后,非同类要加+或-
4 问题?
怎样才能将目录和下面子文件夹里的文件同时设定权限呢?在下面第二部分的chmod绝对模式里我们可以找到解决方法,
符号模式下的,目前我还没有答案,希望大家可以找到解决方法。
以上都不能对文件夹下的子文件产生效果。为什么会这样呢,奇怪吗?我们将在第三部分弄清楚文件和目录权限的区别
二 chmod 绝对模式
下面我们来通过实践说明一下:
1 首先看到Documents下有个名为find-3.sh的文件它的权限是属主即所有者和所在组都是有读写的权限,其他用户只有只读权限,现在我们将它的权限通过chmod的命令重新设置为所有用户都只有可执行权限,因为1代表可执行权限,所以从左边起第1、 2、3个数字均为1所以mode为0111。
我们可以在下图中看到find-3.sh的权限已经变成所有用户只有执行权限了
2
我们将find-3.sh的权限设置为属主有读写执行权利,所在用户组有读写权利,其他用户只读,
计算过程如下:
1)1+2+4=7(属主位权限对应数字相加)所以属主位应为7,可读写执行
2)2+4=6 所在用户组权限位值应该为6,可读写
3)4 其他用户可读
所以mode值为:0764,
我们输入命令 chmod 0764 find-3.sh之后用 ls -l 查看,该文件此时的权限符合我们的预想
3.如果需要将该目录下的所有文件权限设置成相同值,则将文件名替换为 ‘* ’号即可
我们将该目录下所有文件权限设置成属主可读写执行,用户组可读写,其他用户只读
查看后所有文件权限已经变成我们想要的了,不是吗?
4 虽然我们将Documents下的文件和文件夹的权限设为属主可读写执行,用户组可读写,其他用户只读,但是查看文件夹下的文件,发现其权限并没有改变。
就像上面图中有个log的文件夹,查看其中文件,权限并没有变成我们想要的属主可读写执行,用户组可读写,其他用户只读这样的权限
如果我们想把一个文件连同子目录下的所有文件都变成我们需要的权限该如何设置呢?
用—R 参数
现在我们看到文件夹下的文件和子文件夹权限变成我们设定的权限了
那么子文件夹中的文件呢?
转到对应目录 ls -l 看一下文件属性
目录的读权限:可以列出目录下的文件
目录的写权限:可以在目录中创建文件
目录的执行权:可以搜索访问该目录
tips: 我们要是不希望别的用户在我们的目录下创建新文件,就取消他们对该目录的写权限;
不想让别的用户看到我们目录里有什么文件,就取消他们对该目录的读权限
如果不想其他用户看到目录里有什么文件,也不能在其中创建新文件,但是允许他们可以执行目录下某个文件
我们可以将他们对该目录的权限设为:- - x,只可以执行(对要执行的文件也要赋予执行的权利)
下面我们通过几个实际的例子来加深认识
1 在Documents目录下有log这个子目录,log权限为drw-rw-rw- ,即所有用户都没有执行的权利
我们尝试用cd命令切换到log子目录下,出现“Permission denied”说明权限不够
看一下上面所说的目录权限的说明,目录的执行权限意味着可以访问搜索该目录,而现在所有的用户对log文件都没有执行的权限,所以不能访问到该目录
在我们为log加上属主可以执行的权限后,以属主身份cd切换到log下,是可以成功切换的。
2 首先我们看到 log目录下,属主有读写执行各个文件的权限
现在我们取消属主对log目录的读写权利,这样属主对log就只有执行权力,而属主仍然对log目录里的文件都有读写执行权限。(从上面学习中,我们已经知道,对目录的权限改变并不影响目录下文件权限的改变)。
现在我们再分析一下,对目录没有读写权限了,但是对里面的文件有读写权限,那我们究竟对文件还能读写吗?
* 1 首先我们尝试访问log目录,因为属主对log有执行权限,根据目录执行权限的含义,所以我们可以访问log目录(上面已讲)
* 2 然后我们看看能不能列出log下面有哪些文件,发现没有权限
这并不奇怪,因为我们作为属主身份,对log目录没有读权限所以也就不能列出该目录下的文件
* 3 在我们取消log读写权限之前,看到log目录中有一个shell脚本文件del.sh
那么我们现在执行下./del.sh,发现是可执行的
* 4 那如果我们取消属主对del.sh的执行权力,再执行可以吗?
先来分析以下,现在对log有执行权力,但是对log下的del.sh没有执行权力
现在我们来执行看看结果
即使对log有执行权限,对要执行的del.sh没有执行权限也是不行的,执行不了
现在我们总结下上面*1~*4:
* 5 如果我们取消属主对log的执行权力,赋予对log下del.sh的执行权力,,再执行del.sh,可以执行吗?
答案是不能执行,对目录不能执行也就是不能搜索访问该目录下的文件
四 总结
符号模式和绝对模式,我倾向于绝对模式,原因是只要熟练记住权限对应的数值,就可以用数字来设定权限,快捷简便,符号模式的话,会有各种用户组的u、g、o,增加取消权限的加减号的,敲命令的过程相对繁琐一点。而且现在知道了绝对模式下将目录下文件和子目录中文件同时设置权限的方法,符号模式下的解决办法还需要再去寻找。
目录的读写权限和文件的读写权限区别很明显,前者是可以列出目录下的文件和创建新文件,后者就是读取文件的内容和向文件写入。对于执行权限的区别我的理解是
如果对目录没有执行权限,但是对目录下的文件有执行权限,那么相当于对该文件也没有权限
如果对目录有执行权限,但是目录下的文件没有执行权限,相当于对该文件也没有权限
所以要执行一个目录下的文件,必须目录和文件都具有执行权限。