4.4 设置用户ID和设置组ID
与一个进程相关联的ID有6个或更多,如下表所示:
与每个进程相关联的用户ID和组ID |
|
实际用户ID 实际组ID |
我们实际上是谁,这两个字段在登录时取自口令文件中的登录项,通常在登录会话期间这些值不会改变,但root进程可改变他们。 |
有效用户ID 有效组ID 附加组ID |
规定其文件访问权限,用户文件访问权限检查。 |
保存的设置用户ID 保存的设置组ID |
通常有效用户ID,等于实际用户ID。有效组ID等于实际组ID.
每个文件都有一个所有者和组所有者。所有者由stat结构忠的st_uid成员表示。组所有者则有st_gid表示。
但是 可以在文件模式字的中设置一个特殊标志。其含义是“当执行此文件时候,将进程的有效用户ID设置为文件所有者的用户ID.”
再返回到stat函数,设置用户ID位级设置组ID位都包含在st_mode忠。这两位可用常量S_ISUID和S_ISGID测试。
4.5文件访问权限。
在使用linux的时候,我们对chmod的命令可能已经很熟悉,其中有u(user)表示所有者。g(group)表示组,用o(other)表示其他。
比如我们执行chmod u+x xxx文件,表示对xxx文件加上可执行的权限。
每个文件有9个访问权限位,St_mode值也包含了针对文件的访问权限位,所有文件类型都有访问权限。每个文件有9个访问权限位,如下表所示:
文件的9个访问权限位 |
|
St_mode屏蔽 |
意义 |
S_IRUSR S_IWUSR S_IXUSR |
用户-读 用户-写 用户-执行 |
S_IRUSR S_IWUSR S_IXGRP |
组-读 组-写 组-执行 |
S_IROTH S_IWOTH S_IXOTH |
其他-读 其他-写 其他-执行 |
第一个规则:我们用名字打开任一个类型的文件时候,对改名字包含的每个目录,包括他可能隐含的当前工作目录都已,都应该具有执行权限。这就是为什么对于目录执行权限位常被称为搜索位的原因。
举个例子:为了打开/usr/include/stdio.h文件,我们就要对目录/ ,/user /usr/include具有打开执行权限。然后需要具有对该文件本身适当的权限。这取决于何种模式打开他。
进程每次打开,创建和删除一个文件的时候,内核就进行文访问权限测试,而这种测试可能涉及到文件按的所有者。进程的有效id,以及进程的附加组ID,两个所有者ID,是文件的性质,二两个有效ID和附加组id,则是进程的性质。。
内核进行测试是:
(1)若进程的有效用户ID,是0(超级用户),则如许访问。这就给予了超级用户对整个文件系统进行处理掉最充分的自由。
(2)若进程的有效用户ID,等于文件的所有者id,也就是该进程拥有此文件。那么:若所有着适当的访问权限被设置。则允许访问。否则被拒绝。适当的访问权限位指的是,若进程为读而打开该文件。则用户读位应为1,若进程为写而打开该文件,则用户写位应该为1.做进程将执行该文件,则用户的执行位应为1.
(3)若进程的有效组ID,或者进程的附加组id,之一等于文件的组id,那么:若组适当的访问权限被设置,则允许访问。否则拒绝。
(4)若其他用户适当的访问权限位被设置。则允许访问,否则拒绝访问。
按着四部执行。
4.6 新文件和目录的所有权
新文件的用户id设置为进程的有效用户ID,,
(1)新文件的组ID,可以是进程的有效组ID。
(2)新文件的组ID,可以使他所在目录的组id。