Chinaunix首页 | 论坛 | 博客
  • 博客访问: 794346
  • 博文数量: 106
  • 博客积分: 1250
  • 博客等级: 少尉
  • 技术积分: 1349
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-09 09:38
文章分类

全部博文(106)

文章存档

2014年(1)

2013年(13)

2012年(92)

分类: LINUX

2012-03-02 13:43:50

函数声明:
#include
#include
uid_t getuid(void);
uid_t geteuid(void);

说明:
两个函数分别获得用户 UID 值( getuid() ) 与 用户有效 UID 值 ( geteuid() )。

测试程序
(用 root 用户创建编译并创建可执行文件):
#include
#include
#include
#include
#include

int
 main()
{
    int 
fd;
    
printf("uid study: \n");
    
printf("Process's uid = %d, euid = %d ", getuid(), geteuid());
    
    if( (
fd = open("test.txt", O_RDWR)) == -1 ) {
        
printf("Open failure, errno is %d :%s \n", errno,strerror(errno));
        
exit(1);
    
} else {
        
printf("Open successfully!\n");
    
}

    close(fd);
    
exit(0);
}

在没有 test.txt 文件情况下的默认输出
uid study: 
Process's uid = 0, euid = 0 Open failure, errno is 2 :No such file or directory 
 

说明-1
errno 在 errno.h 中有定义:
extern int errno;
strerror() 函数返回一个对错误号进行相应描述的字符串。
由于 text.txt 文件不存在,所以造成打开失败。

下面,用 root 用户在 uid.exe 文件所在目录下建立 test.txt 文件,然后运行程序
linux-beyes:/home/beyes/C # touch test.txt
linux-beyes:/home/beyes/C # ./uid.exe
uid study: 
Process's uid = 0, euid = 0 Open successfully!
 

root 用户自然可以成功打开此文件。切换到普通用户下执行这个程序
beyes@linux-beyes:~/C> ./uid.exe 
uid study: 
Process's uid = 1000, euid = 1000 Open failure, errno is 13 :Permission denied

提示,普通用户没有权限执行这个程序。

下面,用 chmod 命令来对 uid.exe 设置 set_uid(suid) 位,然后再执行这个程序
linux-beyes:/home/beyes/C # chmod 4755 uid.exe
linux-beyes:/home/beyes/C # ll uid.exe 
-rwsr-xr-x 1 root root 11582 06-18 13:02 uid.exe
linux-beyes:/home/beyes/C # exit      
//切换到普通用户
exit
beyes@linux-beyes:~/C> ./uid.exe 
uid study: 
Process's uid = 1000, euid = 0 Open successfully!

现在,文件可以成功打开了!关于文件有效位以及组等有效位的详其他相关介绍:



从上面的运行结果说明: 内核对进程存取文件的许可权的检查,是通过考察进程的
有效用户 ID 来实现的。
阅读(5712) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

-小Y头-2012-03-03 00:50:26

普通用户竟然没有权限……