加入收藏 | 设为首页 | 会员中心 | 我要投稿 徐州站长网 (https://www.0516zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

Unix/Linux编程:文件权限、目录权限

发布时间:2022-10-24 14:32:35 所属栏目:Unix 来源:未知
导读: 文件权限 普通文件的权限

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)

下面程序:

// 将文件权限掩码转换为字符串
char *          /* Return ls(1)-style string for file permissions mask */
filePermStr(mode_t perm, int flags)
{
    static char str[STR_SIZE];
    /* If FP_SPECIAL was specified, we emulate the trickery of ls(1) in
       returning set-user-ID, set-group-ID, and sticky bit information in
       the user/group/other execute fields. This is made more complex by
       the fact that the case of the character displayed for this bits
       depends on whether the corresponding execute bit is on or off. */
    snprintf(str, STR_SIZE, "%c%c%c%c%c%c%c%c%c",
             (perm & S_IRUSR) ? 'r' : '-', (perm & S_IWUSR) ? 'w' : '-',
             (perm & S_IXUSR) ?
             (((perm & S_ISUID) && (flags & FP_SPECIAL)) ? 's' : 'x') :
             (((perm & S_ISUID) && (flags & FP_SPECIAL)) ? 'S' : '-'),
             (perm & S_IRGRP) ? 'r' : '-', (perm & S_IWGRP) ? 'w' : '-',
             (perm & S_IXGRP) ?
             (((perm & S_ISGID) && (flags & FP_SPECIAL)) ? 's' : 'x') :
             (((perm & S_ISGID) && (flags & FP_SPECIAL)) ? 'S' : '-'),
             (perm & S_IROTH) ? 'r' : '-', (perm & S_IWOTH) ? 'w' : '-',
             (perm & S_IXOTH) ?
             (((perm & S_ISVTX) && (flags & FP_SPECIAL)) ? 't' : 'x') :
             (((perm & S_ISVTX) && (flags & FP_SPECIAL)) ? 'T' : '-'));
    return str;
}

目录权限

目录与文件拥有相同的权限方案,只是对 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 参数所指定文件的访问权限

		#include 
       int access(const char *path, int amode);

常量描述

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这个文件,注意这个文件的所有者和文件访问权限设置:

$ ls -l /etc/passwd
-rw-r--r--. 1 root root 2974 325 15:36 /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()

(编辑:徐州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章