Chinaunix首页 | 论坛 | 博客
  • 博客访问: 121928
  • 博文数量: 41
  • 博客积分: 1695
  • 博客等级: 上尉
  • 技术积分: 430
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-21 22:50
文章分类

全部博文(41)

文章存档

2010年(1)

2007年(23)

2006年(17)

我的朋友

分类: C/C++

2007-04-07 10:22:51

      与一个进程相关的ID有六个或者更多,
实际用户ID和实际组ID:是指我们运行程序时的用户身份ID
有效用户ID,有效组ID和添加组ID:决定我们对文件的访问权
设置用户ID和设置组ID
      通常有效用户ID等于实际用户ID,有效组ID等于实际组ID。对于每个文件,还有一个文件所有者和所有组。如果我们用自己的帐户登录去运行别的用户的一个程序,并且希望进程的有效用户ID为文件的所有者,那么我们就需要用到设置-用户-ID和设置-组-ID。

#include    <sys/types.h>
#include    <fcntl.h>
#include    "ourhdr.h"

int
main(int argc, char *argv[])
{
    if (argc != 2)
        err_quit("usage: a.out ");

    if (access(argv[1], R_OK) < 0)
        err_ret("access error for %s", argv[1]);
    else
        printf("read access OK\n");

    if (open(argv[1], O_RDONLY) < 0)
        err_ret("open error for %s", argv[1]);
    else
        printf("open for reading OK\n");

    exit(0);
}

上面代码中使用了access和open两个系统调用,open打开一个函数时,内核以有效用户id和有效组id来测试文件存取许可权,而access则以实际用户id和实际组id来测试存取许可权。
$ ls -l a.out
-rwxrwxr-x 1 stevens 105216 Jan 18 08:48 a.out
上面命令显示a.out文件对所有者和所有组具有读写执行,而且没有设置 设置-用户-ID。
$ a.out a.out
read access OK
open for reading OK
此时,有效用户ID等于实际用户ID,即stevens。实际用户和有效用户都可访问。

$ ls -1/etc/uucp/Systems
-rw-r----- 1 uucp 1441 Jul 18 15:05/etc/uucp/Systems
另外一个文件Systems,所有者是uucp而不是当前的登录用户stevens

$ a.out /etc/uucp/Systems
access error for/etc/uucp/Systems permission denied
open error for /etc/uucp/Systems permission denied
当前有效用户和实际用户都是stevens,因此没有访问Systems的权限。

$ su
成为超级用户
Password:
输入超级用户口令

# chown uucp a.out
改变a.out文件的所有者,
将文件用户ID改为uucp
# chkmod u+s a.out
打开设置用户ID位

$ ls -1 a.out  检查所有者和SUID位
-rwsrwxr-x 1 uucp 105216 Jan 18 08:48 a.out
a.out的所有者变成了uucp,并且设置了 设置-用户-ID位

# exit  回到正常stevens用户

$ a.out /etc/uucp/Systems
access error for /etc/uucp/Systems: Permission denied
open for reading OK
此时,open以有效用户身份探测存取许可权,因为设置了
设置-用户-ID位,有效用户变成了文件的所有者uucp,因此open能够读取文件。而access是以实际用户身份测试,实际用户为stevens,因此access测试失败!

个人理解,错了请指正!
阅读(1259) | 评论(0) | 转发(0) |
0

上一篇:进程间管道通信

下一篇:setjmp与longjmp

给主人留下些什么吧!~~