文件权限与进程ID

1 statfstatlstat

#include<sys/stat.h>

int stat(const char *restrict pathname, struct stat *restrict buf);

int fstat(int fd, struct stat *buf);

int lstat(const char *restrict pathname, struct stat *restrict buf);

这三个函数都可以返回文件的信息结构。stat是一旦给出pathname,它就返回与此命名文件有关的信息结构;fstat函数获取已在描述符fd上打开的文件的有关信息;lstat与stat类似,但是当命名文件是一个符号链接时,它返回改符号链接的有关信息,而不是由该符号链接引用文件的信息。 

第二个参数是buf指针,它指向我们必须提供的一个stat结构,这些函数填写这个由buf指向的stat结构。stat结构基本形式如下:

struct stat{

mode_t st_mode;    /*file type and mode (permissions) */

ino_t st_ino;     /* i-node number */

dev_t st_dev;

dev_t st_rdev;

nlink_t st_nlink;   /* number of links */

uid_t uid;

gid_t gid;

off_t st_size;      /* size in bytes,for regular files

time_t st_atime;   /* time of last access */

time_t st_mtime;  /* time of last modification */

time_t st_ctime;   /* time of last file status change */

}    

通过stat函数可以获得这些文件自身的状态信息。

2 进程相关ID

与一个进程有关的ID有6个或更多。

实际用户ID实际组ID:标识我们究竟是谁。这两个字段在登陆时取自口令文件中的登录项。通常,在一个登录会话期间,这些值并不改变,但是超级用户进程有方法改变它们。

有效用户ID有效组ID:决定了我们的文件访问权限。

保存的设置用户ID保存的设置组ID:在执行一个程序时,包含了有效用户ID和有效组ID的副本。

3 文件访问权限

前面讲到的stat结构中st_mode就包含了文件的访问权限位,它是文件本身的状态信息。

每个文件有9个访问权限位,可将它们分成三类(取自<sys/stat.h>)。

st_mode屏蔽

意义

S_IRUSR

S_IWUSR

S_IXUSR

用户-读

用户-写

用户-执行

S_IRGRP

S_IWGRP

S_IXGRP

组-读

组-写

组-执行

S_IROTH

S_IWOTH

S_IXOTH

其它-读

其它-写

其它执行

这9个常量分成三组

S_IRWXU = S_IRUSR | S_IWUSR | S_IXUSR

S_IRWXG = S_IRGRP | S_IWGRP | S_IXGRP

S_IRWXO = S_IROTH | S_IWOTH | S_IXOTH

每一个文件都有一个所有者和一个组所有者,所有者由stat结构中的st_uid成员表示,组所有者则由st_gid成员表示。而上述的9个访问权限都是针对文件本身的所有者和组所有者而言的(即文件所有者ID具有哪些权限,组所有者ID具有哪些权限)。他们都是文件本身的状态属性,是被静态的记录保存在inode中的。

当一个进程要访问一个文件时,我们说要检查这个进程的访问权限。实际含义是什么呢?其实质是将这个进程的有效(组)ID和要访问文件的所有者(组)ID相比较,确定这个进程对于这个文件是属于什么身份,然后再根据文件自身对于每个身份(所有者、组、其它)的静态权限设置,赋予进程相应权限。

4 进程与文件权限

进程每次打开、创建或删除一个文件时,内核就进行文件访问权限测试。而这种测试设计文件的所有者(st_uid和st_gid)、进程的有效ID(有效用户ID和有效组ID)。两个所有者ID是文件的性质,两个有效ID则是进程的性质。内核进行的测试是:

(1)若进程的有效用户ID是0(超级用户),则允许访问。这给予了超级用户对整个文件系统进行处理的最充分自由。

(2)若进程的有效用户ID等于文件的所有者ID(即进程拥有此文件),那么所有者相应的访问权限位被设置,则允许访问,否则拒绝访问。

(3)若进程的有效组ID等于文件的组ID,那么若组相应的访问权限位被设置,则允许访问,否则拒绝访问。

(4)若其它用户相应的访问权限位被设置,则允许访问,否则拒绝。

注意这是按顺序执行这四步的,即若前面的条件满足则不再检查后面的条件。

当执行一个程序文件时,进程的有效用户ID通常就是实际用户ID,有效组ID通常就是实际组ID。但是可以在文件模式字(st_mode)中设置一个特殊标志,其含义是“当执行此文件时,将进程的有效用户ID设置为文件所有者的用户ID(st_uid)”。与此类似,在st_mode中还可以设置另一位,它使得将执行此文件的进程的有效组ID设置为文件的组所有者ID(st_gid)。在文件模式字的这两位被称为设置用户ID(set-usr-ID)位和设置组(set-group-ID)位。这两位在st_mode中的常量是S_ISUID和S_ISGID。

由此可以看出,进程的有效(组)ID是动态设置的,它一般情况下是进程的实际(组)ID,但在特殊情况下可设置为文件的所有者(组)ID。进程有效ID动态设置好之后,再与文件的静态所有者ID相比较,进而确定进程所应该的权限。

例如,若文件所有者是超级用户,而且设置了该文件的设置用户ID位,然后当该文件由一个进程执行时,则该进程具有超级用户权限,不管执行此文件的进程的实际用户ID是什么,都进行这种处理。例如,UINX程序passwd允许任一用户改变其口令,改程序是一个设置用户ID程序。因为该程序应能将用户的新口令写入口令文件(/etc/passwd或/etc/shadow)中,而只有超级级用户才具有对该文件的写权限,所以需要使用设置用户ID特征。因为运行设置用户ID程序的进程通常得到额外的权限,所以编写这种程序时要特别谨慎。

5 open标志

讲到文件的访问权限是文件本身的属性,又想到open函数中也有oflag参数,表明打开文件时的标志,包括:O_RDONLY(只读打开)、O_WRONLY(只写打开)、O_RDWR(读写打开)、O_APPEND(追加写打开)、O_CREAT(创建)、O_TRUNC(若文件存在则截短为0)。这些也是文件的状态属性,那与文件访问权限属性有什么区别呢?

其实这些open标志是在文件打开时赋予的,它只是临时的保存在这个文件的打开结构中,也就是file结构中的。它们是文件某个打开时的属性,并不是文件本身存放在inode中的静态永久属性。

6 access umask

#include<unistd.h>

int access(const char *pathname, ind mode);

当用open函数打开一个文件时,内核以进程的有效用户ID和有效组ID为基础执行其访问权限测试。有时,进程也希望按其实际用户ID和实际组ID来测试其访问能力。例如当一个进程使用设置用户(组)ID特征作为另一个用户(或组)运行时,可能因设置用户(组)ID获得了额外的权限运行,但它可能想验证其实际用户能否也访问一个给定的文件。access函数就是按其实际用户ID和实际组ID进行访问权限测试的。

高级编程P78的清单4-2程序很好的说明了access的作用。

umask函数则是与进程相关联的文件模式创建屏蔽字

#include<sys/stat.h>

int umask(mode_t cmask);

其中cmaks是由9个文件访问权限常量的若干个按位“或”构成的。

在进程创建一个新文件或新目录时,就一定会使用文件模式创建屏蔽字,对于任何在文件模式创建屏蔽字中为1的位,文件mode中的相应位则一定被关闭(文件mode即是open或creat时指定的mode,它就是新文件的访问权限位)。

UNIX系统的大多数用户都不处理他们的umask值。通常在登陆时,由shell的启动文件设置一次,然后从不改变。尽管如此,当编写创建新文件的程序时,如果我们想确保指定的访问权限位已经激活,那么必须在进程运行时修改umask值,否则有效的umask值可能关闭某些权限位。

umask值一般表示成八进制数,以为代表一种要屏蔽的权限,常用的几种umask值是002、022和027。如002阻止其它用户写你的文件。具体如下表。

屏蔽位

意义(阻止)

400

用户读

200

用户写

100

用户执行

040

组读

020

组写

010

组执行

004

其它读

002

其它写

001

其它执行

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值