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中对此的说明如下:
# umask -S u=rwx,g=rx,o=rxThe 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进制表示,如:# umask 0022umask 通常默认为 0002,它删除了组用户和其他用户的写权限。umask -S 可以显示哪个权限被允许,如:
mode & ~umask可以用一种简单的计算方式,即做减法:
0666
- 0022
= 0644
当然也可以根据umask的值,直接去掉对应的屏蔽权限。