检查用户是否是C的root用户?

Moh*_*nde 36 c unix root

如何验证用户是否为root用户?

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.

  • 同意,完全. (4认同)
  • 但是,Linux标准库确实需要root用户.仅供记录.当然,并非我不同意整体前提.:) (3认同)
  • LSB有很多错误,比如要求应用程序可以使用意外左侧可见的内部glibc函数.:-) (3认同)

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的方法.

  • 'e'代表'有效'; euid是实际用于权限检查的euid.通常,uid和euid是相同的,但如果你在setuid程序中,当它启动时,`getuid`将返回调用该程序的用户的uid,`geteuid`将返回用户的uid拥有可执行文件.您可以使用`seteuid()`将euid设置为uid,然后返回.准确的规则太复杂,无法发表评论. (9认同)
  • @Zack:为什么"评论太复杂"评论总是让我想起费马?;-) (4认同)
  • getuid 和 geteuid 有什么区别? (2认同)
  • `geteuid` 返回有效用户 ID,考虑到对 [`seteuid`](http://www.opengroup.org/onlinepubs/009695399/functions/seteuid.html) 或类似的调用。`getuid` 返回真实的用户 ID。 (2认同)