Unix/Linux编程:文件权限、目录权限
stat 结构中 st_mod 字段的低 12 位定义了文件权限。
可为每一类用户授予的权限如下所示。
执行 ls–l 命令,可查看文件的权限和所有权,如下所示:
头文件< sy
文件权限 普通文件的权限 stat 结构中 st_mod 字段的低 12 位定义了文件权限。 可为每一类用户授予的权限如下所示。 执行 ls–l 命令,可查看文件的权限和所有权,如下所示: 头文件< sys/stat.h>定义了可与 stat 结构中 st_mode 相与(&)的常量,用于检查特定权限 位置位与否。(为 open()系统调用提供了原型,在程序中包含该头文件也可定义这些 常量。)下表列出了这些常量: 常量其他值权限位 S_ISUID 04000 Set-user-ID S_ISGID 02000 Set-group-ID S_ISVTX 01000 Sticky S_IRUSR 0400 User-read S_IWUSR 0200 User-write S_IXUSR 0100 User-execute S_IRGRP 040 Group-read S_IWGRP 020 Group-write S_IXGRP 010 Group-execute S_IROTH 04 Other-read S_IWOTH 02 Other-write S_IXOTH 01 Other-execute 除了上面常量外,还分别将各类(属主、属组及其他)权限掩码定义为常量:S_IRWXU (0700)、S_IRWXG (070)和 S_IRWXO (07) 下面程序:
目录权限 目录与文件拥有相同的权限方案,只是对 3 种权限的含义另有所指。 访问文件时,需要拥有对路径名所列所有目录的执行权限。例如,想读取文件/home/mtk/x,则需拥有对目录/、/home 以及/home/mtk 的执行权限(还要有对文件 x 自身的读权限)。若当前的工作目录为 /home/mtk/sub1 ,访问相对路径名 …/sub2/x 时,需握有 /home/mtk 和/home/mtk/sub2 这两个目录的可执行权限(不必有对/或/home 的执行权限)。 拥有对目录的读权限,用户只是能查看目录中的文件列表。要想访问目录内文件的内容或是这些文件的 i 节点信息,还需握有对目录的执行权限 反之,若拥有对目录的可执行权限,而无读权限,只要知道目录内文件的名称,仍可对其进行访问,但不能列出目录下的内容(即目录所含的其他文件名)。在控制对公共目录内容的访问时,这是一种常用技术,简单而且实用。 要想在目录中添加或删除文件,需要同时拥有对该目录的执行和写权限。 权限检测算法 一旦调用 open()打开了文件,针对返回描述符的后续系统调用(比如,read()、write()、fstat()、fcntl(),以及 mmap())将不再进行任何权限检查。 针对文件检查时,内核所遵循的原则如下: 其实,内核代码在实现上述检查规则时UNIX 文件权限,在构造上也颇具匠心。只有当进程通过其他 测试未能获得所需要的权限时,才去检查进程是否属于特权级进程。这就省去了对 ASU 进程记账标志的设置,该标志用于标记进程是否曾利用过超级用户特权 内核会依次执行针对属主、属组以及其他用户的权限检查,只要匹配上述检查规则之一,便会停止检查。 检查对文件的访问权限:access() 系统调用 access()就是根据进程的真实用户 ID 和组 ID(以及附属组 ID),去检查对pathname 参数所指定文件的访问权限
常量描述 F_OK 有这个文件吗 R_OK 对该文件有读权限吗 W_OK 对该文件有写权限吗 X_OK 对该文件有执行权限吗 由于对某一文件调用 access()与对同一文件的后续操作之间存在时间差,因此(不论间隔多么短暂)执行后续操作时,也无法保证在对文件的后续操作时由 access()所返回的信息依然正确。在某些应用程序设计中,上述情形可能会导致安全漏洞。因此,建议杜绝使用 access() GNU C 库提供了一个功能相似的非标准函数 euidaccess()(及其同义函数 eaccess()),该函数使用进程的有效用户 ID 来检查对文件的访问权限。 Set-User-ID、Set-Group-ID 和 Sticky 位 除了 9 位用来表明属主、属组和其他用户的权限之外,文件权限掩码还另设有 3 个附加位,分别为 set-user-ID (bit 04000)、set-group-ID (bit 02000)和 sticky (bit 01000)位。 set-user-ID 它的出现是为了解决一个重要的问题,即用户如何更改自己的密码? 看起来,好像很容易,用passwd命令就可以 接下来研究一下passwd的工作原理,先来看/etc/passwd这个文件,注意这个文件的所有者和文件访问权限设置:
更新密码会导致上述内容的变化,但是普通用户没有修改这个文件的权限,只有root用户才可以修改它,那么为什么普通用户没有/etc/passwd的写权限,可以修改用户密码? 这是因为,passwd命令有一个特殊的权限,使得passwd命令的文件的所有者是root,而且它的特殊属性中包含了set-user-ID位: 此时, 文件的所有者是root,而且设置了该文件的设置用户ID位,然后当该文件由另一个进程执行时,该进程有了root 的权限。 如/bin/passwd ,该程序是一个设置用户ID程序,普通用户使用passwd 命令更改登录口令时,shell会调用/bin/passwd ,此时shell具有root权限,所以可以修改 /etc/passwd 文件来更改用户登录口令 检查文件是否设置了SUID是使用S_ISUID Set-Group-ID Set-Group-ID可以给程序的某一个组的访问权限。 检查文件是否设置了SUID是使用S_ISGID Sticky 可通过 chmod 命令(chmod +t file)或 chmod()系统调用来设置文件的 sticky 权限位。若对某文件设置了 sticky 权限位,则当执行 ls–l 命令显示该文件时,会在其他用户执行权限字段上看到字母 T,其大小写则要取决于是否对文件开启了其他用户执行权限位,如下所示: 进程的文件模式创建掩码:umask() (编辑:91站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |