Comment définir la capacité CAP_SYS_NICE à un utilisateur de Linux?
Mon programme est à l'aide de l'appel système Linux setpriority()
modifier les priorités des threads qu'il crée. Elle doit fixer des priorités négatives (-10), mais, comme indiqué sur la documentation, l'opération échoue lorsqu'il est exécuté en tant qu'utilisateur normal.
L'utilisateur a besoin de la CAP_SYS_NICE
capacité à être en mesure de définir les priorités qu'il veut, mais je n'ai aucune idée de la façon de donner à une telle capacité de l'utilisateur.
Donc ma question: comment définir CAP_SYS_NICE
capacité pour un utilisateur de Linux?
- Nice -10 est de plus haute priorité, mais vraiment rien, même à distance en temps réel.
- C'est seulement un pointeur, donc je vais ajouter un commentaire: cochez cette réponse: stackoverflow.com/a/17685265/6899
Vous devez vous connecter pour publier un commentaire.
Jan Hudec est juste qu'un processus ne peut pas seulement se donner une capacité, et un setuid wrapper est le moyen le plus évident d'obtenir la capacité. Aussi, gardez à l'esprit que vous aurez besoin de
prctl(PR_SET_KEEPCAPS, ...)
lorsque vous déposez de la racine. (Voir laprctl
page de manuel pour plus de détails.) Sinon, vous aurez baisse de la capacité lors de la transition à votre non-racine réelle de l'id d'utilisateur.Si vraiment vous voulez juste pour lancer les sessions de l'utilisateur avec un autre permis à bon niveau, vous pouvez voir l'
pam_limits
etlimits.conf
des pages de man, comme lepam_limits
module vous permet de modifier la dure de nice limite. Il pourrait être une ligne comme:/etc/security/capability.conf
et capacités en conséquenceIl y a une belle utilitaire pratique pour le réglage des fonctions sur un binaire: setcap. Ce doit être exécuté en tant que root sur votre exécutable de l'application, mais une fois réglé, peut être exécuté en tant qu'utilisateur normal. Exemple:
Vous pouvez confirmer ce que les capacités sont sur une application à l'aide getcap:
Je vous conseille d'intégrer les fonctionnalités dans votre makefile dans la ligne d'installation, qui est généralement exécuté en tant que root, de toute façon. Notez que les capacités ne peuvent pas être stockées dans un fichier TAR, ou tout autre dérivé, sous forme de forfait. Si vous ne le package de votre application, vous aurez besoin d'un script (script postinst pour les paquets Debian) pour appliquer la capacité de déployer.
cap_sys_nice=eip
, en particulier la=eip
partie? Je ne peux pas le voir ni enman setcap
ni dansman capabilities
.Concernant sudo, j'ai ajouté de l'utilisateur comme ceci:
Et puis il a bien fonctionné:
Autant que je sache, Il n'est pas possible d'obtenir une capacité. Racine processus ont toutes les capacités et peut leur donner, mais donné une fois en place, ils ne peuvent pas être retrouvé. Ainsi, vous aurez besoin d'un suid-root wrapper qui donnera toutes les autres capacités et d'exécuter le processus.