我有以下简单的代码来检查我的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/