C setuid和seteuid函数之间的差异 程序1:setuid()的示例 程序2:seteuid()示例

C setuid和seteuid函数之间的差异 程序1:setuid()的示例 程序2:seteuid()示例,c,linux,unix,C,Linux,Unix,两个程序的输出相同。那么,这两个函数之间有什么区别呢?根据参考(手册页),这两个函数都用于设置流程的有效用户ID。这两个程序的功能有什么不同?很清楚这两个程序的区别: 如果用户是root用户或程序设置为user ID root,则必须特别小心。setuid()函数检查调用方的有效用户ID,如果是超级用户,则所有与进程相关的用户ID都设置为uid。发生这种情况后,程序不可能重新获得根权限 因此,一个设置用户ID的根程序,如果希望暂时放弃根权限,使用一个没有权限的用户的身份,然后重新获得根权限,就不

两个程序的输出相同。那么,这两个函数之间有什么区别呢?根据参考(手册页),这两个函数都用于设置流程的有效用户ID。这两个程序的功能有什么不同?

很清楚这两个程序的区别:

如果用户是root用户或程序设置为user ID root,则必须特别小心。setuid()函数检查调用方的有效用户ID,如果是超级用户,则所有与进程相关的用户ID都设置为uid。发生这种情况后,程序不可能重新获得根权限

因此,一个设置用户ID的根程序,如果希望暂时放弃根权限,使用一个没有权限的用户的身份,然后重新获得根权限,就不能使用setuid()。您可以使用seteuid来实现这一点


你有任何例子来验证这一点吗?没有,我不是在*nix机器上。我对上面的手册页参考有疑问。使用setuid,我们可以设置进程的有效用户id。例如:setuid(getuid());执行此语句后,进程的有效用户ID将更改为当前用户。因此,为了重新获得root权限,我只需使用setuid(0);但是为什么手册页引用后面显示的
不能使用setuid()。您可以使用seteuid(2)
来完成这一点。可能的
    #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 $