Linux File Permission

(转自chinaunix)

好吧,我这里就我对 Linux  File Permission 的部份发表一下个人意见,
不见得完全正确,只希望提出来给大家一些参考。

-----------------------------

1) Permission Mode
首先,File Permission Mode 是存在 inode 中的信息,
一共有 12  bit (01)是关闭、1是打开。
其中每一个 bit 所代表的意思分别如下:
suidsgidsticky_bit,
user_readuser_writeuser_execute,
group_readgroup_writegroup_execute,
others_readothers_writeothers_execute


举例: 100111101101 (binary mode)

但在系统应用及管理上,我们一般不是采用 binary mode(二进制)
而是使用 octal mode(八进位 text mode(文字
其中的 octal mode 就是单纯将 binary 换算过来就可以了。
你可试试 linux  bc 命令来算一算:
$ echo "obase=8;ibase=2;100111101101" | bc
4755

不过,若你手边没有 bc 命令或计算器可用的话,那用手工来算也不难:
先列一个 3bit 的对照表:

000 : 0
001 : 1
010 : 2
011 : 3
100 : 4
101 : 5
110 : 6
111 : 7

然后,将 12bit 分成 4 组:
100,111,101,101
再跟据上表就能轻送换算出:
4,7,5,5

不过,在 text mode 的表示上,则有些复杂,因为需将 12 字母压缩为 9 
不过其原理也不难:
    * 
将第一组的 bit 分散在后三组的 x 位置上:
        suid 
盖掉 ux 然后用 s 表示
        sgid 
盖掉 gx 然后用 s 表示
        stickbit 
盖掉 ox 然后用 t表示
    
 x 有设则用小写;若 x 没设则为大写
    
若某一 bit 在打开状态下用文字表示(rwxst)关闭状态下则用 -  表示(S,T)

下面是前例的对照:
[code:1:45bf2e0c43]binary:   100 111 101 101 
text:              rws r-x r-x        
octal:      4       5 [/code:1:45bf2e0c43]

下面是另两例:
[code:1:45bf2e0c43]binary:   010 111 111 101    001 111 111 111
text:       rwx rws r-x        rwx rwx rwt
octal:       2                  7[/code:1:45bf2e0c43]


2) ugo
利用 ls -l 命令,可获得每一个文件的如下信息:
file_type&permission_modelink_count, user, group, size, modification_timefile_name

我们可以从最左边的字段看到十个字母,
第一个为: file type 
其余九个为 permission mode ,又分为三组:user, gorup, others 
对每一个使用者来说,ugo 这三组只能选其一:
 uid  file uid 一致,则取 user 而忽略 group & others 
 uid  file uid 不一致,则再看 gid(s) 若与 file gid 一致。取 group 而忽略 user & others 
 uid  gid  file 都不一致,则取 others 而忽略 user & group
(
注:你可在任何时候输入 id 这个命令得知你所使用的 uid  gid(s))


3) rwx
一旦使用者所参考的 ugo permission 能确定下来之后,
接下来就来看其取的 permission 代表的意思了。

事实上rwx 对下面两种 file type 来说是不一样的:
*
 - 开头为 file
        r: 
读取该档的内容
        w: 
修改该档的内容
        x: 
执行该档(executable)并产生 process
 d 开头为 directory
        r: 
可读取该目录底下的内容(即列出 file  sub dir)
        w: 
可修改该目录底下的内容(即增减 file  sub dir)
        x: 
可进入该目录底下( access ,如门禁卡一般)

其中 directory  x 最不好理解:
就算你对 dir  rw ,若没 x 的话,那也跑不进去做事情,
就好像你是自己套房的主人,却进不了公寓大门一样。

然而,当你对一个 directory 有了 rwx 权限之后,
里面或许有些 file/dir 你是没有 rwx 权限的,
就好比套房里放了一些不属于你的物品:
你没办法打开一看究竟( r)
你没办法偷龙转凤动手脚( w)
你只能干瞪眼却无福消受( x)
但,你却可以将之仍进垃圾桶... 因为你在套房:
可以看到所有物品(r)
可以搬进搬出或 DIY 物品(w)
你有钥匙入门(x)

4) suidsgid, sticky bit

SUID/SGID 
 executable file 而言,
会影响所产生的 process 用哪个 uid/gid
    
若有设,从 file 本身的 uid/gid 继承。
    
若没设,从 parrent process 继承(通常是 shell)
sticky_bit 
在现代的 Linux 系统中,对 file 来说是没任何意的。

 SUID  directory 没啥意义(有设没设都一样)
不过, SGID  directory 来说,
会影响该目录下新建的 file/dir  gid 
    
若有设gid  dir 继承(若是 new dir,其 SGID 也会继承)
    
若没设,那 gid 从产生 new file/dir  process 继承。
至于 directory  sticky bit ,则起到保护文件的作用:
    
若没有设,使用者只要对 dir  w permission ,就能删除 dir 里的文件(请参考前述)
    
若有设,使用者除了要有 w permsissin 之外,还需符合如下两个条件之一:
        * 
使用者之 uid 必须与文件所在目录一致,
        * 
使用者之 uid 必须被删文件一致。
 
5) umask
umask 的作用,就是在新建文件或目录时,需要取消的 permission 
其运算法则为:
new dir: (NOT umask) AND 0777 (000,111,111,111)
new file
 (NOT umask) AND 0666 (000,110,110,110)

其中的 NOT(bitwise)  AND 是罗辑运算:
NOT : 1 
 0, 0  1
AND
 1&&1=1, 0&&0=0, 1&&0=0, 0&&1=0

 0033  umask 为例子来算:
new dir:
* 0033 
换为 bit 000,000,011,011
* NOT 0033 
得:111,111,100,100
与目录 0777 000,111,111,111
 AND 运算得:000,111,100,100
转为 octal 就是:0, 7, 4, 4

new file:
* 0033 
换为 bit 000,000,011,011
* NOT 0033 
得:111,111,100,100
与目录 0666 000,110,110,110
 AND 运算得:000,111,100,100
转为 octal 就是:0, 6, 4, 4

要用减法的话,对 new file 恐怕会不准。
 666-033=633
但事实上:(NOT 033) AND 666 = 644<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

阅读更多
个人分类: 技术文章
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭