Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1740582
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: 系统运维

2012-03-28 13:23:32

正如我们早先描述的那样,当我们打开 一个文件,内核会基于有效用户和组ID来进行访问测试。有时进程会想基于真实用户和组ID来执行它的访问测试。当进程使用set-user-ID或 set-group-ID特性以其他人的身份运行时这非常有用。即使一个进程可能通过set-user-ID成为根用户,它可能仍想检查真实用户是否能访 问给定的文件。access函数基于真实用户和组ID来测试。(把4.5节末尾的4个步骤里的“真实”替换为“有效”。)


  1. #include <unistd.h>

  2. int access(const char *pathname, int mode);
  3. 成功返回0,错误返回-1。

mode为下表常量中的位或值:

mode 描述
R_OK 测试读权限
W_OK 测试写权限
X_OK 测试执行权限
F_OK 测试文件存在

看下面的代码:


  1. #include <unistd.h>
  2. #include <fcntl.h>

  3. int
  4. main(int argc, char *argv[])
  5. {
  6.     if (argc != 2)
  7.         exit(1);
  8.     if (access(argv[1], R_OK) < 0)
  9.         printf("access error for %s\n", argv[1]);
  10.     else
  11.         printf("read access OK\n");
  12.     if (open(argv[1], O_RDONLY) < 0)
  13.         printf("open error for %s\n", argv[1]);
  14.     else
  15.         printf("open for reading OK\n");
  16.     exit(0);
  17. }

使用该程序来操作/etc/shadow文件。首先看该文件以及程序的权限:
$ ls -l /etc/shadow
-r--r----- 1 root shadow 1461 2012-02-03 11:14 /etc/shadow
$ ls -l a.out
-rwxr-xr-x 1 tommy tommy 7289 2012-02-22 10:26 a.out

再运行a.out:
$ ./a.out /etc/shadow
access error for /etc/shadow
open error for /etc/shadow


把自己变为超级用户后,为a.out的设置set-userID权限:
$ su
密码:
# chown root a.out
# chmod u+s a.out
# ls -l a.out
-rwsr-xr-x 1 root tommy 7289 2012-02-22 10:26 a.out

退出root身份
# exit
exit


再执行程序(以普通用户的身份)
$ ./a.out /etc/shadow
access error for /etc/shadow
open for reading OK


在这个例子里,我们把a.out设置为set-user-ID程序,它可以查觉到真实用户(tommy)不能访问这个文件,虽然它可以使用open函数来访问该文件。


在前面的例子以及在第8章里,我们有时会变为超级用户,来证明事情是怎么工作的。如果你在一个多用户系统而没有超级用户权限的话,你无法完全重现这些例子。

阅读(623) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~