Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在linux中打开原始套接字而不成为超级用户_C++_C_Linux_Sockets - Fatal编程技术网

C++ 在linux中打开原始套接字而不成为超级用户

C++ 在linux中打开原始套接字而不成为超级用户,c++,c,linux,sockets,C++,C,Linux,Sockets,我必须编写一个ping函数才能在Linux上运行。语言是C++,所以C也很好。 在Internet上搜索并查看ping命令的源代码,结果发现我应该创建一个原始套接字: icmp_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); 如果我在未成为超级用户的情况下运行应用程序,则socket函数将返回-1,即套接字未成功创建。如果我以超级用户的身份运行它,一切正常 现在,ping命令确实创建了一个原始套接字,我可以在没有超级用户权限的情况下运行它 我的问

我必须编写一个ping函数才能在Linux上运行。语言是C++,所以C也很好。 在Internet上搜索并查看
ping
命令的源代码,结果发现我应该创建一个原始套接字:

icmp_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
如果我在未成为超级用户的情况下运行应用程序,则
socket
函数将返回
-1
,即套接字未成功创建。如果我以超级用户的身份运行它,一切正常

现在,
ping
命令确实创建了一个原始套接字,我可以在没有超级用户权限的情况下运行它


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

您可以将程序设置为SUID命令,有效地授予它根权限,而不授予执行用户。有关示例和说明,请参阅

ping
需要
cap\u net\u raw
功能来完成此操作,而无需(其他)超级用户权限,您的程序也是如此。跑

setcap cap_net_raw+ep your_executable_file

作为root用户,然后普通用户将能够使用该程序。

谢谢,它成功了!但是,如果我尝试在Eclipse中调试它,套接字函数将再次返回-1。我已经尝试将cap_new_raw功能设置为eclipse和gdb,但它不起作用。是的,调试具有功能(或设置了suid位)的程序有点问题,因为允许非特权用户
ptrace
它们将是一个相当大的安全漏洞。也许您可以将eclipse配置为使用sudo运行gdb,这将允许您通过让无特权用户能够运行suid调试器的安全噩梦来调试应用程序。我认为这个问题没有完美的解决办法。好吧,我试试看。谢谢。我发现的一个解决方法是以超级用户的身份运行eclipse。它不是很优雅,但很有效。好吧,用sudo打开eclipse不是一个好主意!这里描述了一个更好的解决方案:仍然无法从非根目录调试SUID程序,就像使用
setcap\u net\u raw+ep