不管是Linux新手还是高手,在使用它的时候不可避免都会遇到Linux权限问题.而这些问题也是初学者问得最多的问题,很多的脚本不能执行的原因就是没有设定正确的权限所致.这里我们来看看Linux下的根限到底是怎么一回事.
当你新建一个文件时,它的最初的权限取决于你的umask值(将在后面说明).权限可以使用chmod命令或是chmod()系统调用来修改一个文件的权限模式.只有在文件所有者才能修改文件的权限模式.唯一例外的就是超级用户:超级用户可以修改任何文件的权限.下面是chmod命令的格式:
chmod [-Rfh] [agou] [ -=] [rwxXstugol] filelist
要修改哪些用户的特权:
字符 |
含义 |
a |
修改所有用户的特权 |
g |
修改组用户的特权 |
o |
修改其它用户的特权 |
u |
修改所有者的权限 |
执行什么操作:
字符 |
含义 |
- |
删除当前的权限 |
= |
替换当前的权限 |
|
增加当前的权限 |
要修改哪一项权限:
字符 |
含义 |
r |
读访问 |
w |
写访问 |
x |
执行访问 |
s |
SUID或是SGID |
t |
粘附位 |
其中X是表示由BSD衍生出来的UNIX系统特有的选项,它的意思是:如果文件是一个目录,或有一些其它执行位已设置,那么就将文件设置为只可执行.而l则是由System V衍生出来的UNX系统特有的选项,它的意思是:允许对文件进行强制加锁.
-R选项表示chmod命令会递归执行.如果指定了一个目录filelist,那么目录的权限改变了,目录下所有文件的权限也都改变了.如果该目录包含子目录,那么这一地程会一直向下重复.
-f选项表示强制执行,chmod命令不会报告错误.通常在shell中比较有用.
在某些系统中使用-h选项来改变chmod对符号链接的工作方式.如果指定了-h选项,而其中一个参数据为符号链接的话,那么chmod不会改变符号链接所指向的那个文件或目录的权限.
下图说明了命令的使用方法:
计算机八进制的文件权限:
chmod允许用户使用一个四位八进制数字来指定文件权限模式.用户可以通过将权限相加的方式来计算这一数值.下表说明了每个文件权限对应的八进制数.
八进制数 |
权限 |
4000 |
SUID |
2000 |
SGID |
1000 |
粘附位 |
0400 |
所有者可读 |
0200 |
所有者可写 |
0100 |
所有者可执行 |
0040 |
组成员可读 |
0020 |
组成员可写 |
0010 |
组成员可执行 |
0004 |
其它用户可读 |
0002 |
其它用户可写 |
001 |
其它用户可执行 |
因此,一个文件权限如果为“-rwxr-x---”,那么其文件模式为0750,计算过程为:0400 0200 0100 0040 0010=0750.例如常见的/tmp目录的权限就为1777,表示任何用户都可以在该目录下创建文件,但是用户不能删除其它用户的文件.
umask
umask是“用户文件创建模式掩码”的缩写,是一个四位的八进制数值.用来确定一个新创建文件的权限.每个进程都从父进程那里继承了自己的umask.一般该命令会在.bashrc,.profile,.cshrc或是/etc/profile及/etc/bashrc中.
最常见的umask值是022,027以及077.022让文件所有者拥有对新建文件的读写权限,但是其它人对此只读.例如:0666(默认的文件建立模式) 0022(umask)=0644.计算umask值最简单的方法是记住:umask值中的2屏蔽了写权限,而7屏蔽了读,写及执行权限.
常用的umask设置:
umask |
用户访问 |
组访问 |
其它 |
0000 |
所有 |
所有 |
所有 |
0002 |
所有 |
所有 |
读,执行 |
0007 |
所有 |
所有 |
无 |
0022 |
所有 |
读,执行 |
读,执行 |
0027 |
所有 |
读,执行 |
无 |
0077 |
所有 |
无 |
无 |
下面的图片是显示新建文件后的权限,大家可以想想看它对应的mask应是多少.
粘附位:
具有八进制值1000的位叫粘附位,是unix已经发展得不再需要的事物而又不能摆脱其追随的例子.像unix在其上度过它的孩童期的PDP-11/70这样的小内 |