setuid和getuid似乎无法正常工作

时间:2013-11-20 16:27:46

标签: c++ c linux qt

我正在编写一个访问Linux原始套接字的Qt应用程序,因此我需要root权限才能运行该程序。所以我这样做了:

在我的计划中,我在开头就有这个:

if (getuid() != 0)
{
    fprintf(stderr, "You must be root to run this program. UID = %i\n", getuid());
    exit(-1);
}

然后,我以root身份做了“chmod 6777 myProgram”。

但是,当我尝试以普通用户身份运行时,它说: “你必须是root才能运行这个程序.UID = 1002”,其中1002是我正在使用的用户ID。

任何人都可以提出线索吗?

由于

1 个答案:

答案 0 :(得分:4)

您正在混淆getuid()geteuid()。来自getuid()的手册页:

  

getuid()函数返回调用进程的真实用户ID。 geteuid()函数返回调用进程的有效用户ID。

     

真实用户ID是调用该程序的用户ID。由于有效用户ID在执行 set-user-ID 模式进程期间为进程提供了额外权限,因此getuid()用于确定调用进程的真实用户ID。

Linux的手册页更简洁(前一个来自Mac OS X):

  

当执行正常程序时,进程的有效和真实用户ID被设置为执行文件的用户的ID。执行set ID程序时,真实用户ID设置为主叫用户,有效用户ID对应正在执行的文件的set ID位。

对于setuid程序,该文件需要由您想要设置的用户标识所拥有,在大多数情况下是root。