2011-05-03 60 views
5

在linux机器上的用户模式[非root]中,我尝试使用ioctl(iInterfaceSocket, SIOCSIFADDR, &stCommand)绑定套接字。我得到error 13 -> Permission denied because of user mode。如果从用户模式更改为内核模式一切正常。拒绝绑定到套接字的用户模式权限

我只需要在用户模式下绑定套接字。请在解释上述问题的同时提出解决方案。如果我错过了任何信息,请让我知道,我会提供更多信息。

+3

'bind()'有什么问题? – Erik 2011-05-03 15:31:17

+1

@ user736403 - 你想要达到什么目的? 'SIOCSIFADDR'不绑定套接字,'bind()'做。 'SIOCSIFADDR'设置机器网络接口的地址。 – 2011-05-03 15:50:01

+1

只是一个小小的挑剔:以root身份运行程序与在内核模式下运行程序非常不同。以root身份运行的程序大多数时间仍然以用户模式运行;他们只拥有较高的特权。所有进程(根或不进行)在用户和内核模式之间切换,如系统调用如“ioctl”。 – 2011-05-03 16:13:53

回答

7

除非您是root用户,否则无法设置接口地址(在技术上,除非您有CAP_NET_ADMIN)。见devinet.c

解决方案是以root身份运行。如何实现该解决方案,是否使您的整个程序SUID,或要求用户通过sudogksudo运行它,还是要将程序分为两部分(root和非root),该选择取决于您。