4.4 设置用户ID和设置组ID
与一个进程相关联的ID有6个或更多,如下表所示:
与每个进程相关联的用户ID和组ID | |
实际用户ID 实际组ID | 我们实际上是谁,这两个字段在登录时取自口令文件中的登录项,通常在登录会话期间这些值不会改变,但root进程可改变他们。 |
有效用户ID 有效组ID 附加组ID | 规定其文件访问权限,用户文件访问权限检查。 |
保存的设置用户ID 保存的设置组ID |
- 实际用户ID ,实际组ID标示我们是谁。这两个字段在登录时候曲子口令文件的登录项。通常 在登录话间这些值并不改变。但是超级用户进程有方法改变他。
- 有效用户ID,有效组ID,,附加组ID决定我们的文件访问权限。
- 保存设置用户ID ,保存的设置组ID在执行一个程序时候包含了有效用户ID,he和有效组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具有打开执行权限。然后需要具有对该文件本身适当的权限。这取决于何种模式打开他。
- 对于一个文件的读权限决定了我们能否打开该文件进行读操作。这与open函数的O_RDONLY,O_RDWR标志有关系。
- 对于一个文件的写权限决定了我们是否能够打开该文件进行写操作。这与open函数的O_WRONLY,O_RDWR标志有关系。
- 为了在open函数中对一个文件制定O_TRUNC标志,必须对该文件进行具有写权限。
- 为了在该目录下创建一个新文件,必须对这个目录具有写权限和执行权限。
- 为了删除一个文件,必须对包含该文件的目录具有写权限和执行权限,对该文件本身不需要读写权限。
- 如果用6个exec函数中的任何一个执行某个文件,都必须对该文件具有执行全新啊。该文件必须是一个普通文件。
进程每次打开,创建和删除一个文件的时候,内核就进行文访问权限测试,而这种测试可能涉及到文件按的所有者。进程的有效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。