我使用以下简单代码来检查我的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"。
我已经为创建的可执行文件中的每个人设置了所有权限,我甚至在cygwin中使用cygstart --action = runas。/ a.exe将可执行文件作为root运行,并且它仍然没有&#39工作。
有趣的是setgid(用于更改组)功能与setgid(197121)完美配合,即使没有特殊权限或运行。因此,我不知道为什么这个函数总是返回错误。
有关我的代码可能导致问题的错误的任何想法吗?
感谢您的关注。
答案 0 :(得分:0)
发布的代码必须由具有适当权限的用户运行。也许是:
sudo ./a.exe
这里是setuid()
的(linux)手册页的摘录" EPERM用户没有特权(Linux:没有CAP_SETUID功能),uid与调用进程的真实UID或保存的set-user-ID不匹配。"