我有以下简单的代码来检查我的getuid函数:

            uidActual=getuid();

            printf ("User id is [%d]\n", uidActual);

            error=setuid(197623);
            printf("[%d]",error);

            uidActual=getuid();
            printf ("\n User id is [%d]\n", uidActual);


但是它总是返回-1作为错误,因此uid不变。

setuid中的197623看起来很正确,除了其他方面,我在mkpasswd命令中具有以下内容:

user1:197609:197609 [...]

user2:197623:197121 [...]

其中197609和197623必须是用户的ID,因为实际上我是使用用户1启动该应用程序的,并且我获得了正确显示在开头和结尾的ID:“用户ID为197609”。

我已经为创建的可执行文件的所有人设置了所有权限,甚至使用cygstart --action = runas ./a.exe以cygwin的根用户身份运行该可执行文件,但它仍然不起作用。

有趣的是,即使没有特殊权限或运行,setgid(用于更改组)功能也可以与setgid(197121)完美配合。所以我不知道为什么这个函数总是返回一个错误。

关于可能导致问题的代码错误的任何想法?

感谢您的关注。

最佳答案

发布的代码必须由具有适当特权的用户运行。也许通过:

sudo ./a.exe


这是(linux)手册页中setuid()的摘录

“ EPERM用户没有特权(Linux:不具有CAP_SETUID功能),并且uid与调用过程的实际UID或保存的设置用户ID不匹配。”

关于c - 为什么我的setuid函数不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35880447/

10-11 22:54