setuid和seteuid函数

时间:2015-10-12 10:46:36

标签: c linux unix

我试图找出setuid和seteuid函数之间的区别。那时,他们中的许多人说以下是不同之处。它 在setuid的手册页中显示。

  

因此,一个set-user-ID-root程序希望暂时删除root权限,假定一个非特权用户的身份,然后重新获得root权限,则不能使用setuid()。您可以使用seteuid(2)完成此操作。

我对上面的手册页引用有疑问。使用setuid我们可以设置进程的有效用户ID。 对于Ex:

setuid(getuid());

执行此语句后,进程的有效用户标识将更改为当前用户。所以,重新获得根 许可,我只是使用,

setuid(0);

但为什么手册页参考显示

afterward cannot use setuid(). You can accomplish this with seteuid(2)

2 个答案:

答案 0 :(得分:2)

  • setuid()函数将所有三个进程UID(成功时)设置为函数参数中指定的UID。 Root权限只能从saved-uid进程字段中获取,该字段刚刚被setuid调用覆盖。因此,在unistd.h文件中定义了_POSIX_SAVED_IDS的系统上,在调用setuid()之后无法恢复为root。 setuid()是一张单程票。
  • seteuid()函数不会覆盖saved-uid字段,因此在函数调用后可以重新获取root权限。
  • 我不确定你问题中提到的setuid(0)是否有实际工作(或者你的系统上没有定义_POSIX_SAVED_IDS)。

答案 1 :(得分:0)

请注意手册页的措辞:它适用于set-user-id-root程序(因此可执行文件由用户root拥有,suid位已设置)。