lienhua34
2014-09-02

1 文件的设置用户 ID位 和设置组 ID位

与进程相关联的 ID 如下表所示,

表 1: 与进程相关联的用户 ID 和组 ID
实际用户 ID 我们实际上是谁
实际组 ID
有效用户 ID 用于文件访问权限检查
有效组 ID
附加组 ID
保存的设置用户 ID 由 exec 函数保存
保存的设置组 ID

保存的设置用户 ID 和保存的设置组 ID 在执行一个程序时包含了有效用户 ID 和有效组 ID 的副本,这个后面我们学习到进程时在详细学习。

此处,我们重点讲一下其他几个。一个进程的实际用户 ID 和实际组 ID 即为当前登录会话使用的用户ID 和该用户所在的组 ID。当执行一个程序文件时,有效用户 ID 通常就是实际用户 ID,有效组 ID 通常就是实际组 ID。但是,程序文件的文件模式字可以通过设置特殊标志(设置用户 ID 位或设置组 ID 位)来将进程的有效用户 ID 或有效组 ID 设置为程序文件的所有者 ID 或所有组 ID。设置用户 ID(set-user-ID)位的含义是“当执行此文件时,将进程的有效用户 ID设置为文件所有者的用户 ID”。与此相似,设置组(set-group-ID)位的含义是“当执行此文件时,将进程的有效组 ID 设置为文件所有组 ID”。

例如,若文件所有者是超级用户,而且设置了该文件的设置用户 ID 位,然后当该程序由一个进程执行时,则该进程将具有超级用户权限。例如,程序 passwd 允许任一用户改变其口令,该程序是一个设置用户 ID 程序。因为该程序应将用户的新口令写入只有超级用户才有写权限的口令文件中。

文件设置用户 ID 位及设置组 ID 位都包含在 stat 结构的st_mode 值中,这两位可用常量S_ISUID 和S_ISGID 进行测试。

2 文件访问权限

stat 结构的st_mode 值中包含了针对文件的访问权限位。所有文件类型都具有访问权限。每个文件有 9 个访问权限位,如表 2 所示。

表 2: 文件的 9 个访问权限位
st_mode 屏蔽 意义
S_IRUSR 用户 -读
S_IWUSR 用户 -写
S_IXUSR 用户 -执行
S_IRGRP 组 -读
S_IWGRP 组 -写
S_IXGRP 组 -执行
S_IROTH 其他 -读
S_IWOTH 其他 -写
S_IXOTH 其他 -执行

关于文件访问权限位的使用方式如下:

• 用名字打开任一类型的文件时,对该名字中包含的每一个目录,包括它可能隐含的当前工作目录都应具有执行权限。例如,

为了打开文件/usr/include/stdio.h,需要对目录/、/usr 和/usr/include具有执行权限。然后,需要具有对该文件本身的适当权限。如果当前工作目录是/usr/include,那么为了打开文件 stdio.h,则需要有对该工作目录的执行权限。

注意:对于目录的读权限和执行权限的意义是不相同的。读权限允许我们读目录,获取在该目录中所有文件名的列表。当一个目录是我们要访问文件的路径名的一个组成部分时,对该目录的执行权限使我们可通过该目录(也就是搜索该目录,寻找一个特定的文件名。)

• 文件的读权限决定了我们是否能够打开该文件进行读操作。

• 文件的写权限决定了我们是否能够打开该文件进行写操作。

• 为了要在一个目录中创建一个新文件,必须对该目录具有写权限和执行权限。

• 为了删除一个现有的文件,必须对包含该文件的目录具有写权限和执行权限。对该文件本身则不需要有读、写权限。

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

3 内核文件访问权限测试

进程每次打开、创建或删除一个文件时,内核就进行文件访问权限测试。这种测试可能涉及文件的所有者(st_uid 和st_gid)、进程的有效 ID(有效用户 ID 和有效组 ID)以及进程的附加组 ID。内核进行的测试按下面步骤依次进行:

1. 若进程的有效用户 ID 为 0(即超级用户),则允许访问。

2. 若进程的有效用户 ID 等于文件的所有者 ID,那么:若所有者适当的访问权限位被设置,则允许访问,否则拒绝访问。适当的访问权限位指的是,若进程为读而打开该文件,则用户读位应为 1;若进程为写而打开该文件爱你,则用户写位应为 1;若进程将执行该文件,则用户执行位应为 1.

3. 若进程有效组 ID 或进程附加组 ID 之一等于文件的组 ID,那么,若组适当的访问权限位被设置,则允许访问,否则拒绝访问。

4. 若其他用户适当的访问权限位被设置,则允许访问,否则拒绝访问。

4 新文件和目录的所有权

新文件的用户 ID 设置为进程的有效用户 ID。关于组 ID,POSIX.1 允许实现选择下列之一作为新文件的组 ID。

1. 新文件的组 ID 可以是进程有效组 ID。

2. 新文件的组 ID 可以是它所在目录的组 ID。

对于 Linux 2.4.22,新文件的组 ID 取决于它所在目录的设置组 ID 为是否被设置。如果该目录的这一位被设置,则新文件的组 ID 设置为目录的组 ID;否则,将新文件的组 ID 设置为进程的有效组 ID。

(done)

UNIX环境编程学习笔记(7)——文件I/O之文件访问权限与进程访问控制的更多相关文章

  1. UNIX环境编程学习笔记(12)——文件I/O之目录操作

    lienhua342014-09-18 1 引言 在 UNIX 系统中,目录是一种特殊的文件类型.我们可以使用 open 函数来打开目录,获取文件描述符,然后调用 stat 函数来获取目录的属性信息, ...

  2. UNIX环境编程学习笔记(8)——文件I/O之校验当前登录用户对文件的访问权限

    lienhua342014-09-03 通过前面一篇随笔(文件访问权限与进程访问控制),我们知道内核校验文件的访问权限使用的是进程的有效用户 ID 和有效组 ID.但有时我们需要知道当前登录用户对某个 ...

  3. UNIX环境编程学习笔记(9)——文件I/O之文件访问权限的屏蔽和更改

    lienhua342014-09-10 1 文件访问权限 在文件访问权限和进程访问控制中,我们已经讲述过文件访问权限位,为了方便,我们重新列在下面, 表 1: 文件的 9 个访问权限位  st_mod ...

  4. UNIX环境编程学习笔记(17)——进程管理之进程的几个基本概念

    lienhua342014-10-05 1 main 函数是如何被调用的? 在编译 C 程序时,C 编译器调用链接器在生成的目标可执行程序文件中,设置一个特殊的启动例程为程序的起始地址.当内核执行 C ...

  5. UNIX环境编程学习笔记(13)——文件I/O之标准I/O流

    lienhua342014-09-29 1 标准 I/O 流 之前学习的都是不带缓冲的 I/O 操作函数,直接针对文件描述符的,每调用一次函数可能都会触发一次系统调用,单次调用可能比较快捷.但是,对于 ...

  6. UNIX环境编程学习笔记(10)——文件I/O之硬链接和符号链接

    lienhua342014-09-15 1 文件系统数据结构 UNIX 文件系统通过 i 节点来存储文件的信息.如图 1 所示为一个磁盘柱面上的 i 节点和数据块示意图.其中 i 节点是一个固定长度的 ...

  7. UNIX环境编程学习笔记(6)——文件I/O之判断文件类型

    lienhua342014-09-01 1 文件类型 我们平时最常接触的文件类型有普通文件(regular file)和目录(di-rectory file),但是 UNIX 系统提供了多种文件类型: ...

  8. UNIX环境编程学习笔记(3)——文件I/O之内核 I/O 数据结构

    lienhua342014-08-27 内核使用三种数据结构表示打开的文件,分别是文件描述符表.文件表和 V 节点表. (1) 每个进程在进程表中都有一个记录项,记录项中包含有一张打开文件描述符表,每 ...

  9. UNIX环境编程学习笔记(2)——文件I/O之不带缓冲的 I/O

    lienhua342014-08-25 1 文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用.文件描述符是一个非负整数.当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符. ...

随机推荐

  1. LR中,URL -based script与HTML -based script区别

    在Web(HTTP/HTML)录制中,有2种重要的录制模式.用户该选择那种录制模式呢?HTML-mode录制是缺省也是推荐的录制模式.它录制当前网页中的HTML动作.在录制会话过程中不会录制所有的资源 ...

  2. golang后台任务库

    功能需求 本来想用linux自带的corntab,然而corn调试困难,而且不支持以下需求 能分布式 有http接口 能调试 有统计 kala 这个需求也不算小众,于是在网上查了一下,果然有,而且还比 ...

  3. Android Studio OkHttpClient使用

    本次来记录下OkHttpClient的使用,OkHttpClient是用来完成android 客户端对服务端请求的工具. 首先记住,使用网络的时候一定要加入权限,加入到AndroidMainfest. ...

  4. 机器学习笔记,使用metrics.classification_report显示精确率,召回率,f1指数

    sklearn中的classification_report函数用于显示主要分类指标的文本报告.在报告中显示每个类的精确度,召回率,F1值等信息. 主要参数: y_true:1维数组,或标签指示器数组 ...

  5. Jquery 延迟加载框架

    http://www.appelsiini.net/projects/lazyload

  6. Android——黑名单管理(二)

    说明:多加一点完善 1.在操作类 DAO 将连接数据库也放到了构造方法中(错误),加删除全部的方法 2.主界面增加了姓名一栏,用layout文件将对话框分离出来 3.删除加确认提示 4.加删除全部按钮 ...

  7. Unicode Character Set and UTF-8, UTF-16, UTF-32 Encoding

    在计算机内存中,统一使用unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为utf-8编码. 用记事本编辑的时候,从文件读取的utf-8字符被转换为unicode字符到内存里,编码完成保存 ...

  8. Knockout开发中文API系列2–创建数据模型和监控属性

    Observables,这个词的翻译来自汤姆大叔,对于部分翻译不是很准确的,欢迎大家留言,以得到更好的翻译. Knockout是建立在以下3个核心功能之上的: 1.    属性监控与依赖跟踪 2.   ...

  9. 15.5.26-linq to ef多级外链查询

    方法一: var query = db.Test.Where(x => true) .Include(x => x.ColB.Select(s => s.ColBRelated)) ...

  10. [转]css选择器优先级深入理解

    转载自:http://www.jb51.net/css/67029.html 一.基础选择器 css基础选择器有标签选择器.类选择器.id选择器.通用选择器 1.标签选择器 每个html页面都由很多个 ...