在Linux中打开RAW套接字而不是超级用户

时间:2015-03-04 15:13:13

标签: c++ c linux sockets

我必须写一个ping函数才能在Linux上运行。语言是C ++,所以C也不错。

在Internet上搜索并查看ping命令的源代码,结果发现我应该创建一个原始套接字:

icmp_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

如果我在没有超级用户的情况下运行我的应用程序,socket函数将返回-1,即套接字未成功创建。如果我以超级用户身份运行它,一切正常。

现在,ping命令会创建一个原始套接字,我可以运行它没有超级用户权限

我的问题是:如何在不由超级用户执行的情况下授予我的应用程序创建原始套接字所需的所有权限?

2 个答案:

答案 0 :(得分:6)

没有(其他)超级用户权限,

ping需要cap_net_raw才能执行此操作,您的程序也是如此。运行

setcap cap_net_raw+ep your_executable_file

以root身份,然后普通用户就可以使用该程序。

答案 1 :(得分:1)

您可以使程序成为SUID命令,有效地授予它root权限,而不会将它们授予执行用户。有关示例和说明,请参阅here