#include<stdio.h> #include<sys/types.h> #include<unistd.h> void main() { printf("Real user id = %d, Effective User id = %d\n",getuid(),geteuid()); setuid(1000); printf("Real user id = %d, Effective User id = %d\n",getuid(),geteuid()); setuid(1014); printf("Real user id = %d, Effective User id = %d\n",getuid(),geteuid()); }
输出:
guest $ ./a.out Real user id = 1000, Effective User id = 1014 Real user id = 1000, Effective User id = 1000 Real user id = 1000, Effective User id = 1014 guest $
#include<stdio.h> #include<sys/types.h> #include<unistd.h> void main() { printf("Real user id = %d, Effective User id = %d\n",getuid(),geteuid()); seteuid(1000); printf("Real user id = %d, Effective User id = %d\n",getuid(),geteuid()); seteuid(1014); printf("Real user id = %d, Effective User id = %d\n",getuid(),geteuid()); }
输出:
guest $ ./a.out Real user id = 1000, Effective User id = 1014 Real user id = 1000, Effective User id = 1000 Real user id = 1000, Effective User id = 1014 guest $
两个程序都提供相同的输出。 那么,这两个函数有什么区别呢? 根据参考(手册页),这两个函数都用于设置进程的有效用户标识。 这两个程序的function在哪里不一样?
这个文档很明显的区别在于:
如果用户是root或程序是set-user-ID-root,那么必须特别小心。 setuid()函数检查调用者的有效用户标识,如果它是超级用户,则所有与进程相关的用户标识都设置为uid。 发生这种情况之后,程序不可能重新获得root权限。
因此,一个希望临时删除root权限的set-user-ID-root程序,假定非特权用户的身份,然后重新获得root权限,之后不能使用setuid() 。 你可以用seteuid做到这一点 。
询问前请花时间阅读手册; 这样的问题很容易避免。