我有这个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)
。 请看看这里