`/ etc / sudoers` - ¿especifica` env_keep` para un solo comando?

23

¿Hay alguna forma de especificar que sudodebería preservar ciertas variables de entorno solo para comandos específicos? Para algunos propósitos me gustaría mi $HOMEenv. variable preservada cuando ejecuto ciertos comandos. Para otros fines y otros comandos, quiero que se restablezca. ¿Se puede hacer esto con /etc/sudoers?

Editar:

Gracias por las respuestas. Me pregunto si podría hacer una pregunta de seguimiento, que es "¿Por qué, entonces, esto no funciona?"

En el ejemplo que intento poner a trabajar, quiero sudo nanoleer mi $HOME/.nanorc. Si uso esto:

Defaults:simon env_keep=HOME

Funciona perfectamente. Si uso esto:

Defaults!/bin/nano env_keep=HOME

o esto:

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

No está funcionando en absoluto. ¿Alguna sugerencia de por qué? (Estoy en pruebas de Debian, por cierto)

(Nota: no creo que sea nanoespecífico, por cierto, puedo reproducir el comportamiento con un script bash de una línea que simplemente echos $HOME).

simon
fuente
1
En lugar de intentar que nano ejecute sudo para usar el mismo archivo de configuración, use sudoediten su lugar. sudoeditejecutará, copiará el contenido de un archivo a un archivo tmp y ejecutará el editor de su elección como su usuario, cuando el editor salga, verificará si cambió algo y, de ser así, reemplazará el original con el editado. Puede seleccionar qué editor desea que se ejecute configurando los $EDITORentornos o $ VISUAL`.
Arrowmaster
@Arrowmaster: gracias, parece un enfoque mejor que el que estaba jugando. Puesto que ya estoy envolviendo sudocon una función de la mía, simplemente he añadido un if [ "$1" == "$EDITOR" ]; thenbloque y ahora estoy llamando sudoediten lugar :)
Simon

Respuestas:

21

Para anular env_keepsolo para /path/to/command(cuando se invoca a través de cualquier regla, por cualquier usuario) y para el usuario joe(sin importar qué comando esté ejecutando):

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

Puede usar -=o +=para eliminar o agregar una entrada a la env_keeplista.

Gilles 'SO- deja de ser malvado'
fuente
genial, gracias. No pude encontrar un ejemplo adecuado de esa sintaxis. Ahora que me lo deletreas, puedo ver cómo debería haberlo resuelto desde la manpágina, y me siento un poco tonto. Sin embargo, esta respuesta también ayudará a otros.
Simon
1
@simon: No se sienta tonto, también encuentro que la descripción de la sintaxis en la sudoerspágina del manual es difícil de resolver a partir de la descripción formal y los ejemplos son más fáciles de localizar si ya sabe cómo escribirlos.
Gilles 'SO- deja de ser malvado'
hmm, tal vez hablé pronto. Ahora que lo intento, no puedo hacer que funcione. ¿Puedo molestarte para que leas mi revisión?
Simon
1
@simon: Supongo que también tienes una entrada que te permite hacer todo y no tiene esa env_keepconfiguración ( simon ALL = ALL). Sudo usa la última entrada coincidente.
Gilles 'SO- deja de ser malvado'
Tenga cuidado, si secure_path está configurado, también tendrá que agregar valores predeterminados: joe! Secure_path
Jistanidiot
6
Cmnd_Alias      PBUILDER = /usr/sbin/pbuilder,/usr/sbin/cowbuilder
Defaults!PBUILDER       env_keep+=HOME

Esas líneas son mías /etc/sudoerspara corregir el problema que pbuilderbusca $HOMEsu archivo de configuración de usuario, pero debe ejecutarse como root (moverlo a /rootalgo frustra el propósito de tener un sistema y un archivo de configuración de usuario).

Arrowmaster
fuente
sí, ese es un caso de uso muy similar al que tenía en mente, ¡gracias!
Simon
¿Tienes alguna idea de por qué los ejemplos en mi revisión no parecen funcionar?
Simon
@simon sudo es muy exigente con el orden de las entradas en su configuración, las entradas posteriores sobrescribirán las anteriores. Podría haber algún conflicto como ese en su configuración.
Arrowmaster
1

sudoers hombre:

   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.

Por lo tanto, sí, puede hacerlo usando env_reset, env_keepy env_checken / etc / sudoers.

Paweł Brodacki
fuente