unix文件权限详解

当我们使用ls -l查看文件的时候,经常会看到如下的情况:
drwxr-xr-x   2 root root  4096  9月 25 21:41 bin/
drwxr-xr-x   3 root root  4096  9月 25 21:41 boot/
drwxr-xr-x   2 root root  4096  9月 25 21:38 cdrom/
drwxr-xr-x  17 root root  4180 12月  2 11:48 dev/
在第一行用十位来表示文件的权限和类型。
其中第一位,用来表示文件的类型,分别为:
-:表示普通文件
d: 表示目录文件
l: 表示符号链接文件
f: 表示有名管道
s: 表示socket文件
c: 表示字符设备,在驱动中很常见
b: 表示块设备
后面九位,三个划分为一组,分别为用户权限,用户组权限和其他用户权限这三组。
在这三组表示中,前两位表示一样的,分别表示可读权限和可写权限,r和w表示
特殊的地方,存在于第三位。一般情况下,我们看到第三位经常为x或者-,这
表示可执行权限。
但是偶尔我们也会看到文件的类型是:
-rwSrwsr-t 1 daniel daniel    0 12月  2 12:45 test*
用户的第三位显示为S,而所属组第三位显示为s,其他用户第三位显示为t,这又是
表示什么意思?
用户权限的第三位S:表示执行时设置用户ID
用户组权限的第三位S:表示执行时设置用户组ID
首先要明白一点:什么是执行时设置用户的ID,我们举个例子,有一个名为a.out的
可执行文件,他是daniel用户创建的,那么他的所有者用户就是daniel,现在我用
一个名为rich的帐号登录主机(unix一般都是多用户的),假设我具有执行a.out的权限,
我去执行a.out,就出现了一个进程,那个这个进程的用户ID是rich还是daniel?
如果不设置“执行时设置用户ID位”,那么进程的用户ID是rich,因为是rich去执行的,
如果设置了“执行时设置用户ID位”,那么进程的用户ID是可以修改为daniel的。
那小s表示什么权限呢?
当可执行权限x和可设置用户ID位S都被设置时,则会变成小s。
最后我们说下,在其他用户组权限的第三位t表示什么?这是一个很特殊的标志,称为粘住位
(sticky bit),意义是,如果一个可执行程序文件的这一位被设置了,那么程序在第一次
被执行并结束后,其程序的正文部分的一个副本仍被保存在交换区中。在很早之前,这个策略
能够带来很高的效率,但是现在硬件配置都很高了,意义不大,另外它还可能带来安全问题。
所以它很少在普通文件上使用,反而是使用在了目录文件上,有它另外的意义。
如果一个目录设置了粘住位,则只有对该目录具有写权限的用户在满足下面的条件之一时,才能
删除或则更名该目录下的文件:
1.拥有此文件
2.拥有此目录
3.是超级用户
所以目录/tmp就是设置粘住位的典型使用者。能够让用户不能删除或者更名其他用户的文件
drwxrwxrwt  10 root root  4096 12月  2 13:17 tmp
我们在使用chmod指令时,有两种设置权限的方式。
一种是:
chmod o+r+w a.out
另一种是:
chmod 674 a.out
这两种参数之间有着一种对应关系。
之前我们提到过,权限分了三组,每组三位。这样我们可以利用一个三位二进制的数来表示
一组权限。也确实是这么设计的。但是这样会引发一个问题,三组权限中的第三位,都不是
二值的,例如用户权限组的第三位,可以设置为:不能执行(-),可执行(x),在执行时设置
用户ID(S),可执行同时在执行时设置用户ID(s),这四种情况,如果只是用一位来对应的表示,
那肯定是没法表示完全的。
解决这个问题的办法是,再引入一个三位的二进制数,对应用来表示这三组权限的第三位。
我们来看一个例子:
-rwSrwsrwt 1 daniel daniel    0 12月  2 13:38 test1*
test1文件的访问权限如上所示。
用stat命令查看:
  文件:"test1"
  大小:0         块:0          IO 块:4096   普通空文件
设备:803h/2051d Inode:1712241     硬链接:1
权限:(7677/-rwSrwsrwt)  Uid:( 1000/  daniel)   Gid:( 1000/  daniel)
最近访问:2012-12-02 13:38:14.983527158 +0800
最近更改:2012-12-02 13:38:14.983527158 +0800
最近改动:2012-12-02 14:11:51.603586450 +0800
创建时间:-
我们可以看到:7677/-rwSrwsrwt
他们的对应关系:7677的开头的“7”,表示“Sst”这三位都为“1”构成的。后面的“677”就表示了
三组权限。
还有值得注意的一点就是:粘住位和其他用户可执行权限位,当他们同时设置或者单一的其他用
户可执行权限位被设置时,显示也是t,所以不能根据t来判断其他用户可执行权限位是否被设置。

你可能感兴趣的:(unix文件权限详解)