检查用户是不是是C中的root用户?
Posted
技术标签:
【中文标题】检查用户是不是是C中的root用户?【英文标题】:Check if user is root in C?检查用户是否是C中的root用户? 【发布时间】:2011-05-08 18:39:09 【问题描述】:如何验证用户是否为root?
【问题讨论】:
通常,这么短的问题是不完整的。在这种情况下,它只是简洁。 你不应该。看我的回答。 【参考方案1】:getuid
或 geteuid
,取决于您的真正意思。无论哪种情况,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用户?的主要内容,如果未能解决你的问题,请参考以下文章
C# - 如何检查用户的输入是不是存在于组合框中(使用的数据绑定项)