linux文件权限

来源:互联网 发布:java 两个数组值交换 编辑:程序博客网 时间:2024/06/05 14:29

linux 下有2种文件权限表示方式,即“符号表示”和“八进制表示”。

(1)符号表示方式:

-         ---             ---            ---
type   owner       group      others

如ls -l 所显示的,

-rwxr-xr-x 1 root root 6483 May 15 21:24 a.out
-rw-r--r-- 1 root root  150 May 15 21:24 ctest.c

type代表文件类型,可能的类型如下:

代码 对象类型
 - 常规文件
 d 目录
 l 符号链接
 c 字符特殊设备
 b 模块特殊设备
 p FIFO
 s 套接字

(2)八进制表示方式:

  r 4
  w 2
  x 1
  - 0

 suid 4000
 sgid 2000
 sticky      1000

符号表示和八进制表示对应的2个例子(更多的例子参见http://www.perpetualpc.net/perms_poss.html),如

776  -rwxrwxrw-   |  2776  -rwxrwsrw- 
2776中的第一个8进制数2代表S_ISGID  0002000 set-group-ID bit(参见man 2 open中对mode的说明)
目前在open系统调用中,int open(const char *pathname, int flags, mode_t mode); mode_t大小为4字节,
而4个8进制权限正好使用了4个3位,即1个半字节,如下所示:
    接下来不得不提到umask,笔者在一次strace 跟踪系统调用的时候,发现open中传入的mode是0666,但是创建出来
的文件用ls -l 查看其权限的时候却是-rw-r--r--(对应0644),为什么不是0666?原来是umask在作怪。
umask可称之为文件创建屏蔽,系统使用 umask 值来减少原始请求的权限。man 2 open中对此的说明如下:
The effective permissions are modified by the process's umask in the usual way: The permissions of the created file are (mode & ~umask).
shell下输入umask可查看umask的值,也是8进制表示,如:
# umask0022
umask 通常默认为 0002,它删除了组用户和其他用户的写权限。umask -S 可以显示哪个权限被允许,如:
# umask -Su=rwx,g=rx,o=rx
mode & ~umask可以用一种简单的计算方式,即做减法:
   0666
-  0022
= 0644
当然也可以根据umask的值,直接去掉对应的屏蔽权限。

0 0
原创粉丝点击