当前位置:  开发笔记 > 编程语言 > 正文

我的C/C++应用程序如何确定root用户是否正在执行命令?

如何解决《我的C/C++应用程序如何确定root用户是否正在执行命令?》经验,为你挑选了4个好方法。

我正在编写一个需要root用户权限才能执行的应用程序.如果由非root用户执行,它将以perror消息退出并终止,例如:

    pthread_getschedparam: Operation not permitted

我想使应用程序更加用户友好.作为其早期初始化的一部分,我希望它检查它是否由root执行.如果不是root,它将显示一条消息,指示它只能由root运行,然后终止.

在此先感谢您的帮助.



1> Jerry Coffin..:

getuid或者geteuid是明显的选择.

getuid 检查实际用户的凭据.

添加egeteuid代表effective.它会检查有效凭据.

例如,如果您使用sudo以超级用户身份运行程序,您的实际凭据仍然是您自己的帐户,但您的有效凭据是root帐户(或轮组的成员等)的凭据.

例如,考虑这样的代码:

#include 
#include 

int main() { 
    auto me = getuid();
    auto myprivs = geteuid();


    if (me == myprivs)
        std::cout << "Running as self\n";
    else
        std::cout << "Running as somebody else\n";
}

如果你运行这个正常,getuid()并且geteuid()将返回相同的值,所以它会说"运行的自我".如果你这样做sudo ./a.out,getuid()仍会返回你的用户ID,但geteuid()会返回root或wheel的凭据,所以它会说"像其他人一样运行".



2> R....:

我建议不要进行此更改,而是改进您的错误消息.您的应用程序实际上需要"成为根"是值得怀疑的; 相反,它需要root拥有的某些特权,但具有细粒度安全控制的操作系统可能能够授予应用程序而无需为其提供完全的root访问权限.即使现在不可能,从现在开始可能有6个月或2年,如果您的程序拒绝基于对权限模型的后退假设而不是仅仅检查它是否成功执行,那么用户将会感到烦躁它需要的特权行动.


当您调用pthread_setschedparam时,请检查它是否因EPERM失败.如果是这样,请打印一条消息,告知用户缺少程序运行所需的权限,并建议以root用户身份运行.

3> Vanni Totaro..:
#include  // getuid
#include  // printf

int main()
{
    if (getuid()) printf("%s", "You are not root!\n");
    else printf("%s", "OK, you are root.\n");
    return 0;
}



4> Spudd86..:

您真正想要检查的是,如果您拥有正确的功能集(CAP_SYS_NICE我认为是您需要的功能),请参阅手册页capabilities (7),capget (2)这样,如果您有能力做您想做的事情,它就不会出错,但您不是根.


功能是特定于Linux的,因此使用此方法会损害程序的可移植性.我最喜欢测试执行特权操作的方法就是尝试操作并检查错误.
好吧,如果它只是为了打印更友好的输出,你可以把它全部放在#ifdef HAVE_CAPABILITIES等中,从而跳过代码,如果它在其他系统上运行.
推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有