2011-05-03 16 views
5

En el modo de usuario [no root] en una máquina Linux, estoy intentando vincular un socket utilizando ioctl(iInterfaceSocket, SIOCSIFADDR, &stCommand). Estoy recibiendo error 13 -> Permission denied because of user mode. Si cambia de modo de usuario a modo kernel todo funciona bien.permiso de modo de usuario denegado para enlazar al socket

Necesito vincular el socket en modo de usuario solamente. Sugiera una solución al explicar el problema anterior. Si omití alguna información, por favor avíseme y le brindaré más información.

+3

¿Qué pasa con 'bind()'? – Erik

+1

@ user736403 - ¿qué estás tratando de lograr exactamente? 'SIOCSIFADDR' no enlaza un socket,' bind() 'sí. 'SIOCSIFADDR' establece la dirección de la interfaz de red de la máquina. –

+1

Solo un pequeño detalle: ejecutar un programa como root es muy diferente de ejecutar en modo kernel. Los programas ejecutados como root todavía se ejecutan en modo de usuario la mayor parte del tiempo; ellos solo tienen privilegios elevados. Todos los procesos (root o no) cambian entre el usuario y el modo kernel cuando realizan llamadas al sistema como 'ioctl'. –

Respuesta

7

No puede establecer la dirección de la interfaz a menos que sea root (bueno, técnicamente, a menos que tenga CAP_NET_ADMIN). Ver devinet.c.

La solución es ejecutar como root. Cómo implementar esa solución, ya sea para hacer SUID todo el programa, o pedirle al usuario que la ejecute a través de sudo o gksudo, o si su programa se divide en dos partes (raíz y no raíz), esa elección depende de usted.