Linux File Permission

(转自chinaunix)

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

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

1) Permission Mode
首先,File Permission Mode 是存在 inode 中的信息,
一共有 12 个 bit (0与1):0 是关闭、1是打开。
其中每一个 bit 所代表的意思分别如下:
suid, sgid, sticky_bit,
user_read, user_write, user_execute,
group_read, group_write, group_execute,
others_read, others_write, others_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 或S 表示
        sgid 盖掉 gx 然后用 s 或S 表示
        stickbit 盖掉 ox 然后用 t或T 表示
    * 若 x 有设则用小写;若 x 没设则为大写
    * 若某一 bit 在打开状态下用文字表示(rwxst)关闭状态下则用 -  表示(或S,T)。

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


2) ugo
利用 ls -l 命令,可获得每一个文件的如下信息:
file_type&permission_mode, link_count, user, group, size, modification_time, file_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) suid, sgid, 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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值