我正在编写一个访问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。
任何人都可以提出线索吗?
由于
答案 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。