`/ etc / sudoers` - spécifiez` env_keep` pour une seule commande?

23

Existe-t-il un moyen de spécifier qui sudodevrait conserver certaines variables d'environnement pour les commandes spécifiées uniquement? Pour certaines raisons, je voudrais mon $HOMEenv. variable conservée lorsque j'exécute certaines commandes. À d'autres fins et d'autres commandes, je veux le réinitialiser. Cela peut-il être fait avec /etc/sudoers?

Modifier:

Merci pour vos réponses. Je me demande si je pourrais poser une question de suivi, qui est "Pourquoi, alors, cela ne fonctionne-t-il pas?"

Dans l'exemple que j'essaie de travailler, je veux sudo nanolire mon $HOME/.nanorc. Si j'utilise ceci:

Defaults:simon env_keep=HOME

cela fonctionne parfaitement. Si j'utilise ceci:

Defaults!/bin/nano env_keep=HOME

ou ca:

Cmnd_Alias      NANO = /usr/bin/nano,/bin/nano,/bin/rnano
Defaults!NANO   env_keep=HOME

ça ne marche pas du tout. Des suggestions sur pourquoi? (Je suis sur les tests Debian, btw.)

(Remarque: je ne pense pas que ce soit nanospécifique, btw - je peux reproduire le comportement avec un script bash d'une ligne qui echos $HOME).

Simon
la source
1
Au lieu d'essayer de faire exécuter nano via sudo pour utiliser le même fichier de configuration, utilisez sudoeditplutôt. sudoeditexécutera copier le contenu d'un fichier dans un fichier tmp et exécutera l'éditeur de votre choix en tant qu'utilisateur, lorsque l'éditeur se fermera, il vérifiera si vous avez changé quelque chose et si c'est le cas, remplacez l'original par celui modifié. Vous pouvez sélectionner l'éditeur que vous souhaitez qu'il exécute en définissant les $EDITORvars env ou $ VISUAL`.
Arrowmaster
@Arrowmaster - merci, cela semble être une meilleure approche que celle avec laquelle je jouais. Comme je suis déjà en train sudod' utiliser une fonction qui m'est propre, j'ai simplement ajouté un if [ "$1" == "$EDITOR" ]; thenbloc et j'appelle maintenant à la sudoeditplace :)
Simon

Réponses:

21

Pour remplacer env_keepuniquement pour /path/to/command(lorsqu'il est invoqué via n'importe quelle règle, par n'importe quel utilisateur) et pour l'utilisateur joe(quelle que soit la commande qu'il exécute):

Defaults!/path/to/command env_keep=HOME
Defaults:joe env_keep=HOME

Vous pouvez utiliser -=ou +=pour supprimer ou ajouter une entrée à la env_keepliste.

Gilles 'SO- arrête d'être méchant'
la source
génial, merci. Je n'ai pas pu trouver un bon exemple de cette syntaxe. Maintenant que vous l'avez épelé pour moi, je peux voir comment j'aurais dû résoudre cela à partir de la manpage, et je me sens un peu idiot. Nul doute que cette réponse aidera également les autres.
Simon
1
@simon: Ne vous sentez pas idiot, je trouve moi aussi la description de la syntaxe sudoersdifficile à trouver à partir de la description formelle et les exemples plus faciles à localiser si vous savez déjà comment les écrire.
Gilles 'SO- arrête d'être méchant'
hmm - peut-être que j'ai parlé bientôt. Maintenant que j'essaie, je ne peux pas vraiment le faire fonctionner. Puis-je vous déranger pour jeter un œil à ma révision?
simon
1
@simon: Je suppose que vous avez également une entrée qui vous permet de tout faire et qui n'a pas ce env_keepparamètre ( simon ALL = ALL). Sudo utilise la dernière entrée correspondante.
Gilles 'SO- arrête d'être méchant'
Attention, si secure_path est défini, vous devrez également ajouter des valeurs par défaut: joe!
Secure_path
6
Cmnd_Alias      PBUILDER = /usr/sbin/pbuilder,/usr/sbin/cowbuilder
Defaults!PBUILDER       env_keep+=HOME

Ces lignes sont de moi-même /etc/sudoerspour corriger le problème qui pbuilderrecherche $HOMEson fichier de configuration utilisateur mais doit être exécuté en tant que root (le déplacer vers va /rootun peu à l' encontre de l'objectif d'avoir à la fois un système et un fichier de configuration utilisateur).

Arrowmaster
la source
oui, c'est un cas d'utilisation très similaire à celui que j'avais en tête, merci!
Simon
avez-vous une idée pourquoi les exemples de ma révision ne semblent pas fonctionner?
simon
@simon sudo est très pointilleux sur l'ordre des entrées dans sa configuration, les entrées ultérieures écraseront les précédentes. Il pourrait y avoir un conflit comme celui-ci dans votre configuration.
Arrowmaster
1

homme sudoers:

   env_reset       If set, sudo will reset the environment to only contain
                   the LOGNAME, SHELL, USER, USERNAME and the SUDO_*
                   variables.  Any variables in the caller’s environment
                   that match the env_keep and env_check lists are then
                   added.  The default contents of the env_keep and
                   env_check lists are displayed when sudo is run by root
                   with the -V option.  If the secure_path option is set,
                   its value will be used for the PATH environment
                   variable.  This flag is on by default.

Par conséquent , oui, vous pouvez le faire en utilisant env_reset, env_keepet env_checkdans / etc / sudoers.

Paweł Brodacki
la source