Come consentire all'utente di preservare l'ambiente con sudo?


17

Sto riscontrando il seguente errore nel tentativo di consentire ad alcune variabili di ambiente di passare al nuovo ambiente durante l'esecuzione sudo:

sudo: sorry, you are not allowed to preserve the environment

Alcune informazioni che potrebbero essere utili per il debug:

[deploy@worker1 ~]$ sudo -l
    Matching Defaults entries for deploy on this host:
    requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
    env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET
    XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin, env_keep+="GIT_WORK_TREE GIT_DIR", !requiretty

User deploy may run the following commands on this host:
    (ALL) NOPASSWD: /usr/bin/git, (ALL) /etc/init.d/httpd*, (ALL) /sbin/service, (ALL) /usr/bin/make, (ALL) /bin/echo

Il mio esempio di corsa:

[deploy@worker1 ~]$ export GIT_DIR="/home/ashinn/testing"
[deploy@worker1 ~]$ sudo -E sh -c 'echo "$GIT_DIR"'
sudo: sorry, you are not allowed to preserve the environment

Il mio file sudoers.d per questa specifica configurazione:

Defaults:deploy         env_keep += "GIT_WORK_TREE GIT_DIR", !requiretty
deploy  ALL=(ALL)       NOPASSWD: /usr/bin/git, /etc/init.d/httpd*, /sbin/service, /usr/bin/make, /bin/echo

Ho anche provato ad aggiungere !env_resetai valori predefiniti e continua a fallire con lo stesso errore. Mi sento come se potessi mancare qualcosa di ovvio e avessi bisogno di una seconda serie di occhi. Cosa mi sto perdendo qui?


1
Credo che circa il 93% di noi capisca il punto della tua domanda, ma il tuo comando di esempio non è molto buono.  , se non fallisce completamente, visualizzerà il pre- valore di , poiché la shell espande la variabile nella riga di comando prima ancora di essere invocata. Test migliori sono o o , dove stiamo effettivamente osservando l'ambiente del processo in esecuzione privilegiato. sudo (option(s)) echo $GIT_DIRsudo$GIT_DIRsudosudo printenv GIT_DIRsudo env | grep GIT_DIRsudo sh -c 'echo "$GIT_DIR"'
G-Man dice "Ripristina Monica" il

Risposte:


27

Puoi usare il SETENV"Tag" nel tuo sudoersfile, come in:

deploy  ALL=(ALL)       SETENV: /usr/bin/git, /etc/init.d/httpd*, /sbin/service, /usr/bin/make, /bin/echo

Oppure, per combinarlo con NOPASSWD:

deploy  ALL=(ALL)       NOPASSWD:SETENV: /usr/bin/git, /etc/init.d/httpd*, /sbin/service, /usr/bin/make, /bin/echo

Estratto rilevante dall'uomo sudoers:

SETENV e NOSETENV

Questi tag sovrascrivono il valore dell'opzione setenv in base al comando. Notare che se SETENV è stato impostato per un comando, l'utente può disabilitare l'opzione env_reset dalla riga di comando tramite l'opzione -E. Inoltre, le variabili di ambiente impostate sulla riga di comando non sono soggetti alle restrizioni imposte dalla env_check, env_deleteo env_keep. Pertanto, solo gli utenti fidati dovrebbero poter impostare le variabili in questo modo. Se il comando corrispondente è ALL, il tag SETENV è implicito per quel comando; questa impostazione predefinita può essere ignorata utilizzando il tag NOSETENV.


1

Non specificare l' -Eopzione. Usando -Estai dicendo che tutte le variabili d'ambiente per l'utente deploydovrebbero essere preservate, non soloGIT_DIR

L'esecuzione sudo echo $GIT_DIRdovrebbe funzionare perché hai aggiunto GIT_DIRalla env_keeplista

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.