我正在写一个访问Linux原始套接字的Qt应用程序,所以我需要root权限来运行程序。 所以我这样做了:
在我的程序中,我在开始时是这样的:
if (getuid() != 0) { fprintf(stderr, "You must be root to run this program. UID = %i\n", getuid()); exit(-1); }
然后,我做了“chmod 6777 myProgram”作为根。
但是,当我试图以普通用户身份运行它时,它说:“您必须是root用户才能运行此程序。UID = 1002”,其中1002是我当前正在使用的用户ID。
任何一个人可以发表一条线索吗?
谢谢
你正在混合getuid()
和geteuid()
。 从getuid()
的手册页:
getuid()
函数返回调用进程的真实用户标识。geteuid()
函数返回调用进程的有效用户标识。真正的用户ID是调用程序的用户的ID。 由于有效用户ID在执行set-user-ID模式进程期间为进程提供额外权限,因此使用
getuid()
来确定调用进程的真实用户id。
Linux的手册页更加简洁(前一个来自Mac OS X):
当正常程序执行时,进程的有效和真实用户ID被设置为执行该文件的用户的ID。 当执行一组ID程序时,真实用户ID被设置给主叫用户,有效用户ID对应于正在执行的文件上的设置ID位。
对于setuid程序,文件需要由您想要设置的用户标识拥有,这在大多数情况下是root用户。