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 (
Brut 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 des autorisations -r--r-----
Le serveur est Ubuntu trusty 14.04.3 LTS.
Comment puis-je faire fonctionner cela?
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:
user ALL=(root) NOPASSWD: /bin/grep string I want ( /var/log/thefilename.log
Edit: Comme le souligne @ user23013 dans les commentaires, cela peut être exploité pour grep pour "string I want" dans n'importe quel fichier (et, par extension, également pour "string I" et "string". ) Merci de bien réfléchir avant d'utiliser 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:
Sudo grep "string I want (" /var/log/thefilename.log
Sudo grep 'string I want (' /var/log/thefilename.log
Sudo grep string\ I\ want\ \( /var/log/thefilename.log
Cela est dû au fait que les guillemets et les échappements sont gérés par le shell et n'atteignent jamais Sudo
.
grep
dont vous avez besoinBeaucoup plus facile à déboguer, plus facile à verrouiller un accès spécifique à un fichier spécifique, et beaucoup plus difficile à exploiter.
Étant donné que vous n'avez besoin que de root pour l'accès aux fichiers, pensez à utiliser cat
, tee
ou quelque chose de similaire et à le canaliser vers grep
ou tout autre programme que vous devez exécuter. Par exemple. Sudo cat /file/path | grep …
De cette façon, vous limitez root à l'endroit où vous en avez absolument besoin.
Sudo
est génial, mais parfois ce n'est pas le meilleur choix. Pour cela, j'aime utiliser super
. super
permet également des autorisations élevées, mais il suppose des alias de commande, ce qui est pratique lorsque vous autorisez des lignes de commande compliquées, car elles sont utilisées comme de simples lignes de commande.
votre super.tab ressemblerait à:
grepcmd "grep 'string I want (' /var/log/thefilename.log" user
et serait invoqué comme super grepcmd
.