setuid和getuid似乎不起作用

setuid and getuid seems not working

本文关键字:不起作用 getuid setuid      更新时间:2023-10-16

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

在我的程序中,我在一开始就有这个:

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

然后,我做了"chmod 6777 myProgram"作为root用户。

但是,当我尝试以普通用户的身份运行它时,它会说:"您必须是root用户才能运行此程序。UID=1002",其中1002是我当前使用的用户ID。

有人能发布线索吗?

感谢

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

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

真正的用户ID是调用程序的用户的ID。由于有效的用户ID在设置用户ID模式进程的执行过程中为进程提供了额外的权限,因此getuid()用于确定调用进程的真实用户ID。

Linux的手册页甚至更简洁(之前的手册页来自MacOSX):

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

对于setuid程序,文件需要由要将uid设置到的userid所有,在大多数情况下,该userid是root用户。