R..*_*R.. 57
通常,测试用户是否为root是错误的.POSIX甚至不需要root用户,而是将其留给实现来确定权限的工作方式.代码如:
if (i_am_root) do_privileged_op(); else print_error();
Run Code Online (Sandbox Code Playgroud)
将真正惹恼用户使用高级权限模型,其中root不是必需的,以执行必要的特权操作.我记得早在Linux上刻录CD时,我不得不破解所有cdrecord来源,删除所有无用的检查以查看它是否以root身份运行,当它工作得很好并且有权读取时/dev/sga.
相反,您应该始终尝试执行您需要执行的特权操作,EPERM如果无法通知用户他们没有足够的权限(并且可能应该重试以root身份运行),则应检查或类似操作.
检查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. */
}
Run Code Online (Sandbox Code Playgroud)
请注意,我允许获取uid/euid的任一调用可能失败的可能性(牵强附会,但最好是偏执狂),并且在失败的情况下我们应该假设我们是suid并且恶意用户有某种方式导致系统调用失败,试图隐藏我们的suid.
Mat*_*hen 31
getuid或者geteuid,取决于你的意思.在任何一种情况下,0表示root.
if(geteuid() != 0)
{
// Tell user to run app as root, then exit.
}
Run Code Online (Sandbox Code Playgroud)
R的观点是有效的.您应该考虑试错,或者其他没有明确要求root的方法.