【发布时间】:2011-05-08 18:39:09
【问题描述】:
如何验证用户是否为root?
【问题讨论】:
-
通常,这么短的问题是不完整的。在这种情况下,它只是简洁。
-
你不应该。看我的回答。
如何验证用户是否为root?
【问题讨论】:
【讨论】:
geteuid 返回有效的用户 ID,考虑到对 seteuid 或类似的调用。 getuid 返回真实用户 ID。
getuid 将返回调用程序的用户的 uid,geteuid 将返回用户的 uid拥有可执行文件。您可以使用seteuid() 将euid 设置为uid,然后返回。确切的规则太复杂了,无法评论。
通常测试用户是否为 root 是错误的。 POSIX 甚至不需要 root 用户,而是将其留给实现来确定权限的工作方式。代码如:
if (i_am_root) do_privileged_op(); else print_error();
确实会惹恼具有高级权限模型的用户,其中不需要root来执行必要的特权操作。我记得在 Linux 上刻录 cd 的早期,我不得不对cdrecord 源进行全面破解,以删除所有无用的检查,以查看它是否以 root 身份运行,当它工作得很好并获得了读取 @987654323 的权限时@。
相反,您应该始终尝试您需要执行的特权操作,并检查 EPERM 或类似的,如果它未能通知用户他们没有足够的特权(也许应该重试运行作为根)。
检查 root 有用的一种情况是检查您的程序是否被调用“suid-root”。一个合理的测试是:
uid_t uid=getuid(), euid=geteuid();
if (uid<0 || uid!=euid) {
/* We might have elevated privileges beyond that of the user who invoked
* the program, due to suid bit. Be very careful about trusting any data! */
} else {
/* Anything goes. */
}
请注意,我考虑了获取 uid/euid 的任何一个调用都可能失败的可能性(牵强,但最好是偏执),并且在失败的情况下,我们应该假设我们是 suid 并且是恶意的用户以某种方式导致系统调用失败以试图隐藏我们是 suid。
【讨论】:
最好使用 getuid 或 geteuid,但它位于 zconf.h 头文件中,您必须像下面这样输入:
#include <zconf.h>
#include <stdio.h>
int main()
{
int a;
a=getuid();
//or you can use a=geteuid();
//euid is effective user id and uid is user id
// both euid and uid are zero when you are root user
if (a==0){
printf("you are root user");
//so you can do what`enter code here`ever `enter code here` you want as root user
}
else
printf("please run the script as root user !");
return 0;
}
【讨论】: