我正在编写一个需要root用户权限才能执行的应用程序.如果由非root用户执行,它将以perror消息退出并终止,例如:
pthread_getschedparam: Operation not permitted
我想使应用程序更加用户友好.作为其早期初始化的一部分,我希望它检查它是否由root执行.如果不是root,它将显示一条消息,指示它只能由root运行,然后终止.
在此先感谢您的帮助.
getuid
或者geteuid
是明显的选择.
getuid
检查实际用户的凭据.
添加e
的geteuid
代表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的凭据,所以它会说"像其他人一样运行".
我建议不要进行此更改,而是改进您的错误消息.您的应用程序实际上需要"成为根"是值得怀疑的; 相反,它需要root拥有的某些特权,但具有细粒度安全控制的操作系统可能能够授予应用程序而无需为其提供完全的root访问权限.即使现在不可能,从现在开始可能有6个月或2年,如果您的程序拒绝基于对权限模型的后退假设而不是仅仅检查它是否成功执行,那么用户将会感到烦躁它需要的特权行动.
#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; }
您真正想要检查的是,如果您拥有正确的功能集(CAP_SYS_NICE
我认为是您需要的功能),请参阅手册页capabilities (7)
,capget (2)
这样,如果您有能力做您想做的事情,它就不会出错,但您不是根.