2016-03-08 62 views
0

我有以下简单的代码来检查我的getuid功能:为什么我的setuid功能无法正常工作?

  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 [...]

用户2:197623:197121 [...]

其中,197609和197623必须是用户的id,因为事实上,我以用户1启动应用程序,并且我在开始和结束时正确显示其ID:“用户标识为197609” 。

我已经在创建的可执行文件上为每个人设置了所有权限,我甚至用cygwin - cygstart --action = runas ./a.exe运行可执行文件作为根目录,但它仍然无法运行。

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

对我的代码有什么问题可能会导致问题的任何想法?

感谢您的关注。

+0

那么错误是什么? -1的返回值告诉你有*错误;错误存储在'errno'中,你可以用'strerror(errno)'得到一个描述。 – immibis

+0

不知道errno,它说操作不允许。 – user2638180

回答

0

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

sudo ./a.exe 

这里是从(Linux)的手册页的setuid()

“EPERM摘录的用户不是特权(Linux的:不具备CAP_SETUID能力)和uid不匹配调用进程的真实UID或保存的设置用户ID。“

相关问题