为什么我的setuid功能不起作用?

时间:2016-03-08 23:59:21

标签: c cygwin posix

我使用以下简单代码来检查我的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)完美配合,即使没有特殊权限或运行。因此,我不知道为什么这个函数总是返回错误。

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

感谢您的关注。

1 个答案:

答案 0 :(得分:0)

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

sudo ./a.exe

这里是setuid()

的(linux)手册页的摘录

" EPERM用户没有特权(Linux:没有CAP_SETUID功能),uid与调用进程的真实UID或保存的set-user-ID不匹配。"