Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1902593
  • 博文数量: 217
  • 博客积分: 4362
  • 博客等级: 上校
  • 技术积分: 4180
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-20 09:31
文章分类

全部博文(217)

文章存档

2017年(1)

2015年(2)

2014年(2)

2013年(6)

2012年(42)

2011年(119)

2010年(28)

2009年(17)

分类: LINUX

2011-07-08 18:05:28

    在使用int open(const char *pathname, int flags, mode_t mode)在进行文件打开操作时,其中的第三个参数就是linux下的权限模式,以前也没有很在意这个东西,不就是r,w,x之间的组合吗?后来才发现,这个mode_t并不是我想得那么简单,通过查看内核代码,在types.h文件当中找到了这样的定义:
typedef __mode_t mode_t;
__STD_TYPE __MODE_T_TYPE __mode_t;  /* Type of file attribute bitmasks.  */
    “Type of file attribute bitmasks”,说的就是文件属性当中位屏蔽码的类型,这个类型在许多的结构体当中都有所包含,比如struct stat结构体当中就有。到这里我们搞清楚了mode_t指的是什么了,下面探究一下,有关粘滞位的东东。
    对于ls -l显示的权限模式简单介绍一下,比如使用: ls -l /bin/bash显示如下: 

-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.粘滞位的应用:

  1. ^_^[sunny@sunny-laptop ~/test]55$ ls -l
  2. 总用量 4
  3. -rw-r--r-- 1 sunny sunny 58 2011-07-08 21:17 fan.c
  4. ^_^[sunny@sunny-laptop ~/test]56$ gcc fan.c -o fan.out
  5. ^_^[sunny@sunny-laptop ~/test]57$ ls -l
  6. 总用量 12
  7. -rw-r--r-- 1 sunny sunny 58 2011-07-08 21:17 fan.c
  8. -rwxr-xr-x 1 sunny sunny 7101 2011-07-08 21:18 fan.out
  9. ^_^[sunny@sunny-laptop ~/test]58$ chmod o+t fan.c
  10. ^_^[sunny@sunny-laptop ~/test]59$ chmod o+t fan.out
  11. ^_^[sunny@sunny-laptop ~/test]60$ ls -l
  12. 总用量 12
  13. -rw-r--r-T 1 sunny sunny 58 2011-07-08 21:17 fan.c
  14. -rwxr-xr-t 1 sunny sunny 7101 2011-07-08 21:18 fan.out
  15. ^_^[sunny@sunny-laptop ~/test]61$

    说明:粘滞位只对文件有效,而且只能使用与文件其他使用者的最后一个x位的修改,也就是说只能进行chmod o+t或者chmod o-t这样的操作(这一点不太确定,但我认为是正确的)。如果文件的其他用户没有x权限,那么进行chmod o+t的话,最后一位就变成了T,而不是t。

    2.SUID位的应用:

  1. root@sunny-laptop:/home/sunny/test# gcc fan.c -o fan.out
  2. root@sunny-laptop:/home/sunny/test# ls -l
  3. 总用量 12
  4. -rw-r--r-- 1 root root 45 2011-07-08 21:29 fan.c
  5. -rwxr-xr-x 1 root root 7101 2011-07-08 21:29 fan.out
  6. root@sunny-laptop:/home/sunny/test# chmod u+s fan.out
  7. root@sunny-laptop:/home/sunny/test# chmod u+s fan.c
  8. root@sunny-laptop:/home/sunny/test# ls -l
  9. 总用量 12
  10. -rwSr--r-- 1 root root 45 2011-07-08 21:29 fan.c
  11. -rwsr-xr-x 1 root root 7101 2011-07-08 21:29 fan.out
  12. root@sunny-laptop:/home/sunny/test# exit
  13. exit
  14. ^_^[sunny@sunny-laptop ~/test]67$ whoami
  15. sunny
  16. ^_^[sunny@sunny-laptop ~/test]68$ ls -l
  17. 总用量 12
  18. -rwSr--r-- 1 root root 45 2011-07-08 21:29 fan.c
  19. -rwsr-xr-x 1 root root 7101 2011-07-08 21:29 fan.out
  20. ^_^[sunny@sunny-laptop ~/test]69$ ./fan.out
  21. hello world
  22. ^_^[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

阅读(2712) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~