#include <stdio.h>
#include <sys/types.h>
#include <pwd.h>
int main() {
struct passwd *pwd, *rpwd;
rpwd = getpwuid(getuid());
pwd = getpwuid(geteuid());
printf("real UID:[%s]\n", rpwd->pw_name);
printf("effective UID:[%s]\n", pwd->pw_name);
system("touch /tmp/foo.txt;ls -l /tmp/foo.txt; rm -rf /tmp/foo.txt;");
printf("\nset EUID to 'skin'..\n");
pwd = getpwnam("skin");
seteuid(pwd->pw_uid);
rpwd = getpwuid(getuid());
printf("real UID:[%s]\n", rpwd->pw_name);
pwd = getpwuid(geteuid());
printf("effective UID:[%s]\n", pwd->pw_name);
system("touch /tmp/foo.txt;ls -l /tmp/foo.txt; rm -rf /tmp/foo.txt;");
printf("\nset EUID to 'root'\n");
seteuid(0);
rpwd = getpwuid(getuid());
printf("real UID:[%s]\n", rpwd->pw_name);
pwd = getpwuid(geteuid());
printf("effective UID:[%s]\n", pwd->pw_name);
system("touch /tmp/foo.txt;ls -l /tmp/foo.txt; rm -rf /tmp/foo.txt;");
return 0;
}
编译如下:
skin@ubuntu:~$ sudo gcc -D_GNU_SOURCE -o euid euid.c; sudo chmod +s euid; ls -l euid
-rwsr-sr-x 1 root root 7410 2011-03-30 11:06 euid
运行结果如下:
skin@ubuntu:~/$ ./euid
real UID:[root] //问题1
effective UID:[root]
-rw-r--r-- 1 root root 0 2011-03-30 11:06 /tmp/foo.txt
set EUID to 'skin'..
real UID:[skin] //问题2
effective UID:[skin]
-rw-r--r-- 1 skin root 0 2011-03-30 11:06 /tmp/foo.txt //问题3
set EUID to 'root'
real UID:[skin]
effective UID:[root]
-rw-r--r-- 1 root root 0 2011-03-30 11:06 /tmp/foo.txt
有几个地方不明白:
1.euid文件设置了设置uid位, 用skin用户运行时, 应该euid变成了root, 但为什么real uid也会变成root呢?设置uid位不是 只改变euid吗?
2.程序中调用seteuid(skin的uid)后, 因为是root调的, 所以连real uid都变成了skin吗?不是说只有root调用setuid后才会三个uid都改变吗,而seteuid只改变euid吗?
3.就算调用seteuid(skin的uid)后real uid和euid都变成了skin, 但是system后为什么euid变成了root呢?不也应该是skin吗?
实在是搞不明白,请大家指教,谢谢啦~