2011-05-03 3 views
5

En mode utilisateur [non root] sur une machine Linux, j'essaye de lier un socket en utilisant un ioctl(iInterfaceSocket, SIOCSIFADDR, &stCommand). Je reçois error 13 -> Permission denied because of user mode. Si vous passez du mode usbode au mode noyau, tout fonctionne correctement.permission en mode utilisateur refusée de se lier au socket

Je dois lier le socket en mode utilisateur uniquement. Veuillez suggérer une solution en expliquant le problème ci-dessus. Si j'ai manqué des informations s'il vous plaît faites le moi savoir et je fournirai plus d'informations.

+3

Quel est le problème avec 'bind()'? – Erik

+1

@ user736403 - qu'essayez-vous précisément de réaliser? 'SIOCSIFADDR' ne lie pas un socket,' bind() 'le fait. 'SIOCSIFADDR' définit l'adresse de l'interface réseau de la machine. –

+1

Juste un petit nitpick: exécuter un programme en tant que root est très différent de l'exécution en mode noyau. Les programmes exécutés en tant que root fonctionnent toujours en mode utilisateur la plupart du temps; ils ont juste des privilèges élevés. Tous les processus (root ou non) basculent entre le mode utilisateur et le mode noyau lorsqu'ils effectuent des appels système comme 'ioctl'. –

Répondre

7

Vous ne pouvez pas définir l'adresse de l'interface sauf si vous êtes root (enfin, techniquement, sauf si vous avez CAP_NET_ADMIN). Voir devinet.c.

La solution est de s'exécuter en tant que root. Comment implémenter cette solution, que ce soit pour rendre votre programme SUID complet, ou demander à l'utilisateur de l'exécuter via sudo ou gksudo, ou de factoriser votre programme en deux parties (root et non root), ce choix vous appartient.