检查用户是不是是C中的root用户?

Posted

技术标签:

【中文标题】检查用户是不是是C中的root用户?【英文标题】:Check if user is root in C?检查用户是否是C中的root用户? 【发布时间】:2011-05-08 18:39:09 【问题描述】:

如何验证用户是否为root?

【问题讨论】:

通常,这么短的问题是不完整的。在这种情况下,它只是简洁。 你不应该。看我的回答。 【参考方案1】:

getuidgeteuid,取决于您的真正意思。无论哪种情况,0 都表示根。

if(geteuid() != 0)

  // Tell user to run app as root, then exit.

R 提出的观点是有效的。您应该考虑反复试验,或其他不明确要求 root 的方法。

【讨论】:

getuid和geteuid有什么区别? geteuid 返回有效的用户 ID,考虑到对 seteuid 或类似的调用。 getuid 返回真实用户 ID。 'e' 代表'有效'; euid 是实际用于权限检查的。通常 uid 和 euid 是相同的,但是如果你在一个 setuid 程序中,当它启动时,getuid 将返回调用程序的用户的 uid,geteuid 将返回用户的 uid拥有可执行文件。您可以使用seteuid() 将euid 设置为uid,然后返回。确切的规则太复杂了,无法评论。 如果执行 setuid 程序,有效用户 ID 可能与用户的实际 ID(准确地说是程序所有者的 ID)不同 - 请参阅 lst.de/~okir/blackhats/node23.html @Zack:为什么“评论太复杂”的 cmets 总是让我想起 Fermat? ;-)【参考方案2】:

通常测试用户是否为 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。

【讨论】:

不过,Linux 标准库确实需要 root 用户。只是为了记录。当然,并不是说我不同意整体前提。 :) LSB 有很多错误,例如要求应用程序可以使用意外左可见的内部 glibc 函数。 :-) 事实证明,如果任何 get*uid 调用失败,要么是您的 libc 被破坏(在这种情况下您已经丢失),要么您的代码不是 setuid。系统调用不允许在内核中失败,但负 UID 在 32 位系统上是可能的。 @beeonrope:现代 unix 没有定义根。因此,鉴于问题的标签,它可以说没有答案。 :) @rralf: Indee,如指定的那样,“getuid() 函数应始终成功,并且不保留返回值来指示错误。”【参考方案3】:

最好使用 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;
 

【讨论】:

以上是关于检查用户是不是是C中的root用户?的主要内容,如果未能解决你的问题,请参考以下文章

linux shell 检查是不是是root用户

C# - 如何检查用户的输入是不是存在于组合框中(使用的数据绑定项)

检查(作为普通用户)是不是正在运行管理进程(C、Windows)

c#检查用户是不是是组的成员?

如何在目标c中检查用户是不是登录?

检查请求的用户是不是是 django 中的所有者