在嵌入式系统(2.4 内核)中,我需要从不以 root 身份运行的进程对 eth0 接口的原始套接字访问。
我试图通过从命令行设置 CAP_NET_RAW 功能并以编程方式使用 cap_set_proc() 来解决这个问题,但都没有成功。似乎我没有这样做的权限,在程序中我得到一个 EPERM 错误,在命令行上
无法在进程“1586”上设置上限:(不允许操作)
有没有更简单的方法来做我想做的事?如果没有,成功设置 CAP_NET_RAW 能力需要哪些步骤?
编辑:我有 root 访问权限,但无法以 root 身份永久运行该进程。libcap 的版本是 1.10,没有“setcap”二进制文件,而是一个“setpcaps”。
编辑 - 回答乔治斯科普佐夫:
如果我猜对了,您的建议是使用 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();
谢谢你的帮助。克里斯