Je veux autoriser un utilisateur à exécuter grep (via sudo) et à grep pour une chaîne spécifique dans un fichier spécifique. Je ne veux pas autoriser cet utilisateur à pouvoir exécuter grep sur tous les fichiers. L'utilisateur n'a pas accès en lecture au fichier, d'où l'obligation d'utiliser sudo. J'essaie d'écrire un chèque nagios qui greps le fichier journal d'un autre service sur la machine.
Cependant, cela ne fonctionne pas, sudo continue de demander un mot de passe.
Ma commande est: sudo grep "string I want (" /var/log/thefilename.log
(oui, il y a un raw (
et quelques espaces dans la chaîne que je veux grep)
/etc/sudoers.d/user-can-grep
a ce contenu:
user ALL=(root) NOPASSWD: /bin/grep "string I want (" /var/log/thefilename.log
Ce fichier sudoers appartient à root:root
et dispose d'autorisations-r--r-----
Le serveur est Ubuntu trusty 14.04.3 LTS.
Comment puis-je faire fonctionner cela?
sudo
.grep
, etwhich grep
me dit qu'il utilise/bin/grep
. AFAIK dans le fichier sudo, vous devez spécifier le chemin complet du binaire, même si vous l'appelez sans le chemin complet.Réponses:
Apparemment, sudo aplatit la commande en une chaîne avant de la comparer à une spécification du fichier sudoers. Donc, dans votre cas, vous n'avez pas besoin d'utiliser des guillemets ou toute autre forme d'échappement:
Edit : Comme @ user23013 le fait remarquer dans les commentaires, cela pourrait être exploité pour grep pour "chaîne que je veux" dans n'importe quel fichier (et, par extension, également pour "chaîne I" et "chaîne".) Veuillez bien réfléchir avant en utilisant la vérification des arguments de sudo!
Notez également que les invocations suivantes sont équivalentes, c'est-à-dire que vous ne pourrez pas restreindre les utilisateurs à une représentation spécifique:
Cela est dû au fait que les guillemets et les échappements sont gérés par le shell et ne parviennent jamais
sudo
.la source
sudo
vous avez tapé une chose (qui correspond à la spécification) mais quand il s'agit de l'exécuter, c'est autre chose.sudoers
:user host = NOPASSWD: /usr/bin/vim Editing sudoers file
(avec l'intention de laisser les utilisateurs éditer "Édition du fichier sudoers") peut être exploitécd
en entrant/etc/
et en exécutantsudo vim Editing sudoers file
. Je dirais que pour toute commande d'une complexité raisonnable, il faut suivre l'approche suggérée dans votre commentaire: le shell fournit une$@
variable où vous pouvez vérifier que les arguments sont groupés comme vous vous attendez à ce qu'ils soient groupés.( /var/log
n'importe où et un lien symboliquethefilename.log
vers n'importe quel fichier, l'utilisateur peut alors récupérer àstring I want
partir de n'importe quel fichier.grep
vous avez besoinBeaucoup plus facile à déboguer, plus facile à verrouiller un accès spécifique à un fichier spécifique, et beaucoup plus difficile à exploiter.
la source
Puisque vous n'avez besoin que de root pour l'accès au fichier, envisagez d'utiliser
cat
,tee
ou quelque chose de similaire, et canalisez-le versgrep
ou tout autre programme que vous devez exécuter. Par exemplesudo cat /file/path | grep …
, vous limitez root à l'endroit où vous en avez absolument besoin.la source
sudo
est super, mais parfois ce n'est pas le meilleur choix. Pour cela, j'aime utilisersuper
.super
autorise également des autorisations élevées, mais il suppose des alias de commande, ce qui est pratique lorsque vous autorisez des lignes de commande complexes, car ils sont utilisés comme de simples lignes de commande.votre super.tab ressemblerait à:
et serait invoqué comme
super grepcmd
.la source
sudo
hasCmnd_Alias
(qui peut contenir une ou plusieurs commandes, avec ou sans restrictions d'argument).