-rwxr-xr-x 1 root root 818232 2010-04-19 09:51 /bin/bash
其中第一列即表示该文件的权限属性。
第一个字母"-",表示文件类型。可选的文件类型标识有:
"-":普通文件
"d":目录
"l":符号链接
"c":字符专门设备文件
"b":块专门设备文件
"p":先进先出
"s":套接字
余下的9位每三位划分为一组分别表示所有者权限、所属组权限、其他用户权限。
于是可知普通文件/bin/bash的权限集合为:
所有者(root):rwx;所属组(root):r-x;其他用户:r-x
权限字母表示:
r:读权限(查看文件中的数据/查看目录的内容)
w:写/修改权限(修改文件以及删除/在目录内创建或删除对象)
x:执行权限(执行程序/进入目录)
权限数字表示:
---: 0
--x: 1
-w-: 2
-wx: 3
r--: 4
r-x: 5
rw-: 6
rwx: 7
故/bin/bash的权限集合的数字表示为:755。
但是在mode_t(比如0022)当中的话,它还有一个最高的为,就是我们所说的粘滞位。
粘滞位(sticky bit)的功能是这样的,当某一个文件设置了这一位的时候,这个可执行程序退出后,操作系统会在内存当中保存该程序的内存映像,这样做是为了节约大型程序的启动时间,但是也要占用系统资源。因此,设置这个粘滞位,到不如把自己的程序写得更好些。这一位可以理解为防止删除位,设置了这一位之后,就算用户对目录具有读写的权限,但也只能添加文件而不能删除文件。
由此引出的两个位是SUID和SGID。
当设置了SUID的文件被执行时,该文件将以所有者的身份运行,也就是说无论谁来执行这个文件,他都有文件所有者的所有权限。如果所有者是root的话,那么执行人就有超级用户的权限了,这样的话,其实是不太安全的,因此不要轻易这么来设置这一位。
下面来说一说SGID,这一位和SUID是类似的,当文件运行的时候,文件执行者就具有文件所属组的权限了。
我们继续来讨论一下这些位的简单使用。
1.粘滞位的应用:
^_^[sunny@sunny-laptop ~/test]55$ ls -l
总用量 4
-rw-r--r-- 1 sunny sunny 58 2011-07-08 21:17 fan.c
^_^[sunny@sunny-laptop ~/test]56$ gcc fan.c -o fan.out
^_^[sunny@sunny-laptop ~/test]57$ ls -l
总用量 12
-rw-r--r-- 1 sunny sunny 58 2011-07-08 21:17 fan.c
-rwxr-xr-x 1 sunny sunny 7101 2011-07-08 21:18 fan.out
^_^[sunny@sunny-laptop ~/test]58$ chmod o+t fan.c
^_^[sunny@sunny-laptop ~/test]59$ chmod o+t fan.out
^_^[sunny@sunny-laptop ~/test]60$ ls -l
总用量 12
-rw-r--r-T 1 sunny sunny 58 2011-07-08 21:17 fan.c
-rwxr-xr-t 1 sunny sunny 7101 2011-07-08 21:18 fan.out
^_^[sunny@sunny-laptop ~/test]61$
说明:粘滞位只对文件有效,而且只能使用与文件其他使用者的最后一个x位的修改,也就是说只能进行chmod o+t或者chmod o-t这样的操作(这一点不太确定,但我认为是正确的)。如果文件的其他用户没有x权限,那么进行chmod o+t的话,最后一位就变成了T,而不是t。
2.SUID位的应用:
root@sunny-laptop:/home/sunny/test# gcc fan.c -o fan.out
root@sunny-laptop:/home/sunny/test# ls -l
总用量 12
-rw-r--r-- 1 root root 45 2011-07-08 21:29 fan.c
-rwxr-xr-x 1 root root 7101 2011-07-08 21:29 fan.out
root@sunny-laptop:/home/sunny/test# chmod u+s fan.out
root@sunny-laptop:/home/sunny/test# chmod u+s fan.c
root@sunny-laptop:/home/sunny/test# ls -l
总用量 12
-rwSr--r-- 1 root root 45 2011-07-08 21:29 fan.c
-rwsr-xr-x 1 root root 7101 2011-07-08 21:29 fan.out
root@sunny-laptop:/home/sunny/test# exit
exit
^_^[sunny@sunny-laptop ~/test]67$ whoami
sunny
^_^[sunny@sunny-laptop ~/test]68$ ls -l
总用量 12
-rwSr--r-- 1 root root 45 2011-07-08 21:29 fan.c
-rwsr-xr-x 1 root root 7101 2011-07-08 21:29 fan.out
^_^[sunny@sunny-laptop ~/test]69$ ./fan.out
hello world
^_^[sunny@sunny-laptop ~/test]70$
说明:首先,我切换到了root用户下,创建了一个fan.c文件(内容为hello world程序),然后编译生成了fan.out文件。并将这两个文件的suid位进行了设置。退出root用户,执行fan.out文件,结果正确运行(其实/usr/bin/passwd也就是样的)。这个SUID位只对文件有效,并且只修改文件的所有者的权限,关于小s和大S(s和S)的区别就是,当文件所有者开始有x权限时,执行chmod u+x之后就会成为小s,否则就是大S。
3.SGID的应用:
相信弄懂了SUID的人,对这个也是能够理解的。SGID只针对用户组和目录适用。但是当我在测试的时候,发现了一个问题惊人的问题:用root创建的一个空目录,居然用普通用户就可以删除了。经过研究,发现原来是ubuntu搞的鬼,因为我用的是ubuntu,而ubuntu为了方便用户,故意这么设置的。呵呵,这个可不是我的错了。有关SGID的测试以后补上来。
小结:如果本来在x位上设置了x的时候,设置这些位将会显示小写的(s,s,t),否则会显示为大写的(S,S,T)。这三位如果转化为8进制表示的话,分别对应的是4(SUID),2(SGID),1(sticky bit),0(什么也不是),这样的话,就解决了我开始的疑问了。
4000:set uid on execution
2000:set gid on execution
1000:set sticky bit