linux 目录的粘滞位,linux下粘滞位引出的SUID和SGID

-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

你可能感兴趣的:(linux,目录的粘滞位)