在嵌入式系統(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