在嵌入式系统(2.4内核)中,我需要原始套接字从进程而不是以root用户身份访问eth0接口。作为Linux上的普通用户的原始套接字访问2.4
我试图通过在命令行中设置CAP_NET_RAW功能并使用cap_set_proc()编程方式解决此问题,但两者均未成功。看来,我没有这样的权限,在程序中我得到一个EPERM错误,命令行
无法设置上限的工艺'1586' 上:(不允许的操作)
有没有更简单的方法来做我想要的?如果没有,成功设置CAP_NET_RAW功能需要执行哪些步骤?
编辑:我有根访问权限,但永久运行该进程作为根目录是没有选择。 libcap的版本是1.10,没有'setcap'二进制文件,但是'setpcaps'。
编辑 - 乔治回答Skoptsov:
如果我得到你的权利,你的建议是使用setuid启动一个进程,然后设置CAP_NET_RAW能力,然后删除权限。我用下面的代码尝试了这个,但它似乎不起作用,即使caps命令不返回错误。随着seteuid()注释,原始访问的作品,但只有因为该过程以root身份运行:
cap_t caps = cap_get_proc();
cap_value_t cap_list[1];
cap_list[0] = CAP_NET_RAW;
if (cap_set_flag(caps, CAP_EFFECTIVE, 1, cap_list, CAP_SET) == -1)
{
printf("cap_set_flag error");
}
if (cap_set_proc(caps) == -1)
{
printf("cap_set_proc error");
}
if (seteuid(getuid()) != 0)
{
printf("seteuid error");
}
function_that_needs_raw_access();
感谢您的帮助。 Chris
如果你按照我的建议下面,你的过程将不会运行但是在启动时将拥有root权限,这将允许它设置所需的功能。 – 2012-03-20 15:24:57
感谢您的建议乔治,但是,我没有成功......看到我的编辑。 – Chris 2012-03-21 07:37:09
Chris,在'function_that_needs_raw_access()'中显式需要时你可以非常小心地提升权限? – 2012-03-23 12:27:40