在Linux中使用setuid位

我有这个C文件:

 #include <stdio.h> #include <unistd.h> int main(void) { printf("%s\n", getlogin()); printf("%i\n", getuid()); } 

我编译它,设置UID和GID都为root并设置setuid位,所以它看起来像这样:

 -rwsrwsr-x 1 root root 8735 Apr 8 19:51 a.out 

但是当我打电话$ ./a.out我仍然得到:

 user 1000 

我究竟做错了什么?

真正的用户ID仍然是调用程序的用户,但是有效的用户ID是root。 在一个setuid程序中,它们是不一样的。

要获得有效的用户标识,请调用geteuid() 。 您还可以使用cuserid()获取与有效用户标识关联的名称。

您的程序只有权限更改其uid。 要切换到root,你必须调用setuid(0) 。 请看看这里