我正在编写一个需要 root 用户权限才能执行的应用程序。如果由非 root 用户执行,它将退出并以 perror 消息终止,例如:
pthread_getschedparam: Operation not permitted
我想让应用程序更加用户友好。作为其早期初始化的一部分,我希望它检查它是否由 root 执行。如果不是 root,它会显示一条消息,表明它只能由 root 运行,然后终止。
getuid
或者geteuid
将是显而易见的选择。
getuid
检查实际用户的凭据。
添加e
的 ingeteuid
代表effective
. 它检查有效的凭据。
举个例子,如果您使用sudo
root(超级用户)运行程序,您的实际凭据仍然是您自己的帐户,但您的有效凭据是 root 帐户(或 wheel 组的成员等)的凭据。
例如,考虑如下代码:
#include <unistd.h>
#include <iostream>
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 的凭据,所以它会说“以其他人身份运行”。
#include <unistd.h> // getuid
#include <stdio.h> // printf
int main()
{
if (getuid()) printf("%s", "You are not root!\n");
else printf("%s", "OK, you are root.\n");
return 0;
}
我建议不要进行此更改,而是改进您的错误消息。您的应用程序实际上是否需要“root”是值得怀疑的;相反,它需要 root 具有的某些特权,但是具有细粒度安全控制的操作系统可能能够授予应用程序而不授予其完全 root 访问权限。即使现在不可能,但可能在 6 个月或 2 年后,如果您的程序拒绝基于权限模型的反向假设运行,而不是仅仅检查它是否成功执行,用户会感到恼火它需要的特权操作。
你真正想要检查的是你是否有正确的能力集(CAP_SYS_NICE
我认为是你需要的能力)查看手册页capabilities (7)
,capget (2)
这样如果你有能力做你想做的事,它就不会出错,但你不是不是根。