• 《UNIX环境高级编程》笔记--文件访问权限和新文件、目录所有权


    1.与进程关联的用户ID和组ID

    与一个进程关联的ID有一下几个:
    实际用户ID和实际组ID标识我们究竟是谁。通常在一个会话间值是不会改变的,但是超级用户进程有方法改变
    他们,在以后的进程控制中会进行说明。
    有效用户ID,有效组ID以及附加组ID决定了我们的文件访问权限。
    保存的设置用户ID(setuid)和保存的设置组ID(setgid)在执行一个程序时包含了有效用户ID和有效组ID的
    副本。
     
    通常,有效用户ID等于实际用户ID,有效组ID等于实际组ID。
    每个文件都有一个所有者和组所有者,所有者由stat结构中的st_uid成员表示,组所有者由st_gid成员表示。
    当执行一个程序文件时,进程有效用户ID通常就是实际用户ID,有效组ID通常是实际组ID,但是可以设置文件
    的设置用户ID(set-user-ID)位和设置组ID(set-group-ID )位,如果设置了设置用户ID位,则进程在执行该
    程序时就具有该程序所有者的权限(进程的有效用户ID设置为程序所有者用户ID),如果设置了设置组ID位,
    则进程在执行该程序时就具有该程序的组所有组 的权限 (进程的有效组ID设置为程序组所有者ID)
    设置用户ID位和设置组ID位都包含在st_mode值中。可以使用宏S_ISUID和S_ISGUID测试。

    2.文件的访问权限

    每个文件都有9个访问权限位,可将它们分成3类,如下图:

    它们都包含在<sys/stat.h>文件中。

    下面说明一些文件访问权限的一些规则:
    1.如果我们要访问一个文件,必须要对该文件绝对路径中包含的所有目录都具有执行权限。
    实践如下:
    yan@yan-vm:/home$ ll
    total 16
    drwxr-xr-x  4 root       root        4096 Jun  4 13:03 ./
    drwxr-xr-x 23 root       root        4096 Apr 12 20:43 ../
    drwx------  3 normaluser normalgroup 4096 Jun 12 11:23 normaluser/
    drwx------ 25 yan        yan         4096 Jun 12 11:27 yan/
    yan@yan-vm:/home$ cat /home/yan/test
    123
    yan@yan-vm:/home$ chmod u-x yan/
    yan@yan-vm:/home$ cat /home/yan/test
    cat: /home/yan/test: Permission denied
    yan@yan-vm:/home$
    上面的yan目录被去掉x权限后,yan目录的用户yan也无法访问目录里面的文件。

    2.为了在一个目录中创建新文件,必须要对目录具有写权限和执行权限。
    实践如下:
    yan@yan-vm:/home$ ll
    total 16
    drwxr-xr-x  4 root       root        4096 Jun  4 13:03 ./
    drwxr-xr-x 23 root       root        4096 Apr 12 20:43 ../
    drwx------  3 normaluser normalgroup 4096 Jun 12 11:23 normaluser/
    d--------- 25 yan        yan         4096 Jun 12 11:27 yan/     (目录没有任何权限)
    yan@yan-vm:/home$ chmod u+w yan/
    yan@yan-vm:/home$ ll
    total 16
    drwxr-xr-x  4 root       root        4096 Jun  4 13:03 ./
    drwxr-xr-x 23 root       root        4096 Apr 12 20:43 ../
    drwx------  3 normaluser normalgroup 4096 Jun 12 11:23 normaluser/
    d-w------- 25 yan        yan         4096 Jun 12 11:27 yan/   (增加w权限)
    yan@yan-vm:/home$ touch yan/a.txt
    touch: cannot touch `yan/a.txt': Permission denied     (生成文件失败)
    yan@yan-vm:/home$ chmod u+x yan/
    yan@yan-vm:/home$ ll
    total 16
    drwxr-xr-x  4 root       root        4096 Jun  4 13:03 ./
    drwxr-xr-x 23 root       root        4096 Apr 12 20:43 ../
    drwx------  3 normaluser normalgroup 4096 Jun 12 11:23 normaluser/
    d-wx------ 25 yan        yan         4096 Jun 12 11:27 yan/   (增加执行权限权限)
    yan@yan-vm:/home$ touch yan/a.txt     (成功生成文件)
    yan@yan-vm:/home$

    3.为了在一个目录中删除现有的文件,必须对包含该文件的目录具有写权限和执行权限。

    4.如果用6个exec函数中的任何一个执行某个文件,都必须对该文件具有执行权限,该文件还必须是一个普通文件。

    进程每次打开、创建和删除一个文件时,内核要进行文件访问权限测试:
    1.若进程的有效用户ID是0(超级用户),则允许访问。
    2.若进程的有效用户ID等于文件的所有者ID(也就是该进程拥有此文件),那么:若所有者的适当访问权限位(读,
    写,执行) 设置, 则允许访问,否则拒绝访问。
    3.若进程的有效组ID或进程的附加组ID之一等于文件的组ID,那么若组适当的访问权限位被设置,则允许访问,否则
    拒绝访问。
    4.若其他用户适当的访问权限位被设置,则允许访问,否则拒绝访问。

    3.新文件、目录的所有权

    新文件、目录的用户ID设置为进程的有效用户ID,关于组ID,POSIX.1允许实现选择下列之一作为新文件的组ID:
    1.新文件的组ID可以是进程的有效组ID。(在ubuntu中使用这种实现)
    2.新文件的组ID可以是它所在的目录的组ID。
  • 相关阅读:
    判断单链表中是否有环,找到环的入口节点的理论证明
    交叉熵代价函数(作用及公式推导)
    C#调用C++、Opencv的Dll
    腾讯机器学习一面面经
    C#调用C++类库的几种方式
    2017年腾讯基础研究笔试感受
    关于开源库或者SDK的文档问题
    卷积神经网络Lenet-5实现
    NULL、0、nullptr 区别分析
    C++中,new/delete和malloc/free的区别
  • 原文地址:https://www.cnblogs.com/riskyer/p/3331421.html
Copyright © 2020-2023  润新知