Chinaunix首页 | 论坛 | 博客
  • 博客访问: 412772
  • 博文数量: 36
  • 博客积分: 960
  • 博客等级: 准尉
  • 技术积分: 1368
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-13 19:26
文章分类
文章存档

2018年(3)

2012年(6)

2011年(27)

分类: LINUX

2011-07-01 15:37:31

对于用户空间的文件,我们使用ls –l查看会得到如下结果:

 

  1. drwxr-xr-x 3 root root 4096 2010-10-08 00:12 xxxx

 

第一个字符表示类型,接下来的rwx是文件的所有者root读该文件的操作权限,rwx即指拥有读写和执行的权限,如果为‘-’那么就没有该权限,接下来的-xrroot用户组中的其他用户对该文件的权限,最后的r-xroot用户组外的用户对该文件的操作权限。

 

当执行ls -l ls -al 命令后显示的结果中,最前面的第210个字符是用来表示权限。第一个字符一般用来区分文件和目录:

 

d:表示是一个目录,事实上在ext2fs中,目录是一个特殊的文件。

-:表示这是一个普通的文件。

l: 表示这是一个符号链接文件,实际上它指向另一个文件。

bc:分别表示区块设备和其他的外围设备,是特殊类型的文件。

sp:这些文件关系到系统的数据结构和管道,通常很少见到。

 

210个字符当中的每3个为一组,左边三个字符表示所有者权限,中间3个字符表示与所有者同一组的用户的权限,右边3个字符是其他用户的权限。这三个一组共9个字符,代表的意义如下:

r(Read,读取):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目录的权限。

w(Write,写入):对文件而言,具有新增、修改文件内容的权限;对目录来说,具有删除、移动目录内文件的权限。

x(eXecute,执行):对文件而言,具有执行文件的权限;对目录了来说该用户具有进入目录的权限。

 

-:表示不具有该项权限。

下面举例说明:

rwx------: 文件所有者对文件具有读取、写入和执行的权限。

-rwxrr--: 文件所有者具有读、写与执行的权限,其他用户则具有读取的权限。

-rw-rw-r-x: 文件所有者与同组用户对文件具有读写的权限,而其他用户仅具有读取和执行的权限。

drwx--x--x: 目录所有者具有读写与进入目录的权限,其他用户近能进入该目录,却无法读取任何数据。

Drwx------: 除了目录所有者具有完整的权限之外,其他用户对该目录完全没有任何权限。

 

对于linux文件权限的更详细的文档参考:i.baidu.com/skyforum/blog/item/4219b72699f160168a82a1db.html

 

我们再看一下/proc下的文件:

 

  1. ls –l /proc
  2. ……
  3. dr-xr-xr-x 4 root root 0 2011-06-24 19:16 tty
  4. -r--r--r-- 1 root root 0 2011-06-24 19:16 uptime
  5. ……

 

显然,它们并没有特别之处。

 

在用户空间使用open类似的函数时,参数提供的权限模式为以下标志O_RDONLY 以只读方式打开文件;O_WRONLY 以只写方式打开文件;O_RDWR 以可读写方式打开文件。等。但只内核空间使用的是旗标,注意它们均为8进制表示。

它们位于stat.h (include/linux)中:

 

  1. #define S_IRWXU 00700 // RWX U(User)表示该文件的所有者权限为RWX
  2. #define S_IRUSR 00400 // R USR(User)表示该文件的所有者仅有读权限。
  3. #define S_IWUSR 00200 // W USR表示该文件的所有者仅有写权限。
  4. #define S_IXUSR 00100 // X USR表示该文件的所有者仅有执行权限。


  5. // 下面依次类推
  6. #define S_IRWXG 00070 // RWX G(Group)
  7. #define S_IRGRP 00040 // R GRP
  8. #define S_IWGRP 00020 // W GRP
  9. #define S_IXGRP 00010 // X GRP

  10. #define S_IRWXO 00007 //RWX O(Other)
  11. #define S_IROTH 00004 //R OTH(Other)
  12. #define S_IWOTH 00002 // W OTH(Other)
  13. #define S_IXOTH 00001 //X OTH(Other)

 

它们之间可以任意相或运算,以实现权限的叠加。比如:

 

  1. #define S_IRWXUGO (S_IRWXU|S_IRWXG|S_IRWXO) // 所有人都可读可写可执行

 

// SUID是特权位,可执行的文件搭配这个权限,便能得到特权,任意存取该文件的所有者能使用的全部系统资源。SGID是组特权位,设置在文件上面,其效果与SUID相同,只不过将文件所有者换成用户组,该文件就可以任意存取整个用户组所能使用的系统资源。

 

  1. #define S_IALLUGO (S_ISUID|S_ISGID|S_ISVTX|S_IRWXUGO)
  2. #define S_IRUGO (S_IRUSR|S_IRGRP|S_IROTH) // 所有用户均可读
  3. #define S_IWUGO (S_IWUSR|S_IWGRP|S_IWOTH) // 所有用户均可写
  4. #define S_IXUGO (S_IXUSR|S_IXGRP|S_IXOTH) // 所有用户均可执行

 

一些相关的宏定义解释如下,由于这些宏均是描述文件状态的,所以开头SStat之意。

#define S_IFMT  00170000  // IFIdentity Flag. MT: Type Mask , 也即第16-19bits指示文件类型,通过与运算S_IFMT可以得到文件类型:

 

 

  1. #define S_IFSOCK 0140000 // SOCK文件
  2. #define S_IFLNK 0120000 // 链接文件
  3. #define S_IFREG 0100000 // Regular file 常规文件
  4. #define S_IFBLK 0060000 // Block设备
  5. #define S_IFDIR 0040000 // 目录文件
  6. #define S_IFCHR 0020000 // Char设备
  7. #define S_IFIFO 0010000 // FIFO
  8. #define S_ISUID 0004000 // UID 位
  9. #define S_ISGID 0002000 // GID位
  10. #define S_ISVTX 0001000 // Sticky bit

 

所有文件的权限位均保存在对应的inode中的i_mode里,通常它被定义为unsigned short sizeof(i_mode)216位的作用分别为:

 

 

  1. 00170000 => 0Xf000
  2. #define _S_IFMT 0xF000 /* file type mask */
  3. #define _S_IFDIR 0x4000 /* directory */
  4. #define _S_IFCHR 0x2000 /* character special */
  5. #define _S_IFIFO 0x1000 /* pipe */
  6. #define _S_IFREG 0x8000 /* regular */
  7. #define _S_IREAD 0x0100 /* read permission, owner */
  8. #define _S_IWRITE 0x0080 /* write permission, owner */
  9. #define _S_IEXEC 0x0040 /* execute/search permission, owner */

了解这些旗标将有利于我们在创建内核文件/设备节点等的时候给予适当的操作权限,提高系统的安全性。特别是在使用procsys等内核虚拟文件与用户空间交互的时候。

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

nicekwell2015-04-21 21:47:41

good! 谢谢!