如何验证用户是否为root?
通常测试用户是否为root是一个错误。POSIX甚至不需要root用户,而是将权限如何工作留给实现来确定。像这样的代码:
if (i_am_root) do_privileged_op(); else print_error();
对于拥有高级权限模型的用户,不需要 root 权限即可执行所需的特权操作可能会真正惹恼他们。我还记得在 Linux 上烧录 CD 的早期,我不得不修改 cdrecord
源码中所有无用的检查,以便在具有读取/dev/sga
权限时可以正常工作。
相反地,你应该总是尝试执行你需要执行的特殊操作,并检查是否返回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. */
}
请注意,我考虑了一种可能性(虽然很遥远,但最好保持警惕),即调用get uid / euid的任一次可能失败,在失败的情况下,我们应该假设我们是suid,并且恶意用户已经以某种方式导致系统调用失败,试图隐藏我们是suid。
geteuid() == 0
表示进程正在以超级用户权限(或其他权限)运行。” - BeeOnRopegetuid
将返回调用该程序的用户的uid,而geteuid
将返回可执行文件所有者的uid。您可以通过使用seteuid()
将euid设置为uid,并进行还原。具体规则太复杂了,无法在评论中解释。 - zwol#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;
}