Come faccio a fare in modo che sudo preservi le mie variabili di ambiente?


47

Usando sudo 1.7.4p4 su Solaris 5.10 e sudo 1.6.7p5 su RHEL4 u6 non riesco a vedere come preservare le mie variabili di ambiente, ad esempio $ PYTHONPATH. Ho aggiunto questa linea ai sudoers, ma non fa alcuna differenza:

Defaults !env_reset

Sto facendo qualcosa di sbagliato o l'installazione sudo semplicemente non rispetta il flag env_reset?

Modifica: almeno su Solaris, abbiamo riscontrato che questo problema dipende dalla shell! La shell root standard è Bourne, se invece eseguiamo bash sotto sudo ( sudo bash),! Env_preset manterrà l'ambiente (inclusi PATH e LD_LIBRARY_PATH). Questo è un comportamento piuttosto confuso che devo dire.


Risposte:


44

Usare con attenzione, ci sono problemi di sicurezza con sudo e variabili.

Da man sudoersho scoperto che dovresti usare

Predefiniti env_reset
Valori predefiniti env_keep + = "PYTHONPATH OTHERVARIABLE YETANOTHER"

In Ubuntu, sudoconserva alcune variabili. sudo -iè più come accedere come root e quindi eseguire il comando. Entrambi possono essere scomodi, il primo sudo nano myfilelascia i file di proprietà di root all'interno della tua casa e il secondo sudo -i nano myfiletenterà di aprire / root / myfile.


Correre

sudo printenv PATH

e vedi cosa dà. Qui dà

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

per esempio. Ora esegui sudo visudoe aggiungi la riga

Defaults        secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

sostituendo con quello che hai trovato poco prima. Aggiungi un nuovo percorso ad esso, se necessario.

Informazioni sulle biblioteche:

sudo LD_LIBRARY_PATH=/usr/lib/path/to/a/safe/library your command

Le distribuzioni Linux hanno molta cura PATHe dovresti stare molto attento prima di giocarci. Prestare particolare attenzione all'aggiunta di percorsi come " ." o /home/username, non è sicuro.

Uno dei pericoli dell'aggiunta di percorsi è che si apre la possibilità che i file su questi percorsi rootvengano eseguiti da , aprendo una finestra nella sicurezza del sistema che può essere sfruttata da software dannoso. Potrebbero esserci altri pericoli. Assicurati solo di sapere cosa stai facendo. Il bypass sudodelle misure di sicurezza può rendere Solaris sicuro come Windows XP.


Grazie per il suggerimento Almeno su Solaris, sembra che env_keep funzioni solo in parte, poiché ignora PATH e LD_LIBRARY_PATH. Forse sudo è costruito con impostazioni che lo fanno rifiutare di conservare variabili "pericolose"?
Aknuds1,

Ha funzionato con un altro vairable, come AKNUDS? Puoi anche eseguire sudo sudo -V (sì, due volte sudo!) E vedere cosa dice. Qui la soluzione sopra funziona perfettamente con PYTHONPATH, ma PATH sembra davvero speciale. Il vero problema è con PATH. In Ubuntu costruiscono sudo deliberatamente resettando il PERCORSO.
user39559,

env_keep ha conservato PYTHONPATH e HOME per me, quindi c'è chiaramente qualche filtro in corso.
Aknuds1,

Nella tua soluzione rivista, mi stai suggerendo di collegare in modo sicuro il percorso sudo modificando secure_path, giusto? Non penso di volerlo fare. Probabilmente siamo vicini a una risposta alla mia domanda; Penso che sudo sia costruito per ignorare reset_env e per ignorare variabili come PATH e LD_LIBRARY_PATH, quando specificato con env_keep. Penso di poter fare a meno di preservare PATH / LD_LIBRARY_PATH su sudo, non è un problema, ma è comunque interessante sapere perché non funzionerà :)
aknuds1

Non funzionerà perché gli sudoscrittori sono stati attenti a impedirti di farlo. Non si desidera che vengano caricate librerie dannose perché sono state trovate nel percorso utilizzato da sudo. Ecco perché è ripristinato. Se stai programmando cose che devono essere eseguite da root, copiale nella directory di sistema appropriata.
user39559

8

Giocherellare sudoersdeve essere fatto con cautela, come altri hanno già detto.

Un approccio più semplice per casi più semplici quando ci sono particolari variabili d'ambiente che vuoi preservare è semplicemente passare la variabile d'ambiente che vuoi direttamente attraverso sudo (questo è mostrato come [VAR=value]nella guida cmdline sudo).

Vedi questo piccolo esempio in cui l'ho anche dimostrato per più di una variabile.

$ export MY_V1=1
$ export MY_V2=2
$ printenv | grep MY_V
MY_V2=2
MY_V1=1
$ sudo MY_V1=$MY_V1 MY_V2=$MY_V2 printenv | grep MY_V
MY_V2=2
MY_V1=1

Per l' PYTHONPATHesempio originale nella domanda, basta usare quanto segue:

$ sudo PYTHONPATH=$PYTHONPATH python some_script.py
<script_output_here>

Creare un alias per questo tipo di cose è utile. Così:

$ alias sudopy='sudo PYTHONPATH=$PYTHONPATH python'

1
potrebbe essere utile per farlo - alias sudopy = 'sudo PYTHONPATH = $ PYTHONPATH python' - quindi usalo sudopy some_script.py
In grado Mac

@AbleMac Hai ragione. È stato un errore ... Lo riparerò. Grazie!
Russ,

3

Il tuo Defaults !env_resetaspetto va bene, supponendo che tu non stia chiamando anche sudo con l' -Eopzione.

Potresti provare a rimuovere completamente quella voce.

Hai verificato che stai modificando il file sudoers corretto? Immagino che potrebbe essere /etc/sudoerso /usr/local/etc/sudoersdipende da come è stato installato. L'hai modificato usando visudo?

Come stai correndo sudo? sudo python, sudo su, sudo su -, sudo -s, Qualcosa d'altro? Solo sudo pythone sudo supreserverebbe il tuo ambiente.

Cosa env | grep PYTHONPATHdice? In caso contrario, assicurarsi che PYTHONPATH sia esportato eseguendo export PYTHONPATHe riprovare.

Cosa sudo env | grep PYTHONPATHdice? Se stampa il valore atteso, qualcos'altro sta sovrascrivendo il valore PYTHONPATH. Forse root .bashrc o .bash_profile o i file di configurazione dell'intero sistema.


1
Sono abbastanza sicuro di modificare i sudoer corretti, con il prefisso di installazione corrispondente a sudo. Sto eseguendo sudo come "sudo su". Dovrò tornare da te, tra qualche giorno, sfortunatamente, scritto al resto dei tuoi suggerimenti. Grazie!
Aknuds1,

1
Prova a modificare un'impostazione non importante come editoro passpromptper vedere se hai il file corretto. Oppure usa strace, dtrace, truss o simili e vedi quali file apre.
Mikel,

env | grep PYTHONPATH mentre il mio utente stampa il valore atteso, tuttavia su sudo non viene stampato nulla. Modificando i sudoers, posso assicurarmi che PYTHONPATH sia preservato modificando "env_keep". Tuttavia, env_keep non manterrà PATH o LD_LIBRARY_PATH. Suppongo che sudo abbia una limitazione di sicurezza per non preservare variabili come PATH e LD_LIBRARY_PATH? Un'impostazione del tempo di costruzione forse?
Aknuds1,

1
! env_reset viene ignorato per quanto ne so, ma posso ricontrollare domani. Sono abbastanza sicuro che env_delete non sia impostato, ma posso verificarlo anche io.
Aknuds1,

1
Ho confermato che! Env_reset è ignorato e env_delete non è impostato.
Aknuds1,

-1

Secondo la documentazione di Ubuntu per LD_LIBRARY_PATH :

È necessario utilizzare i file di configurazione /etc/ld.so.conf.d/*.conf

Poi:

  1. Aggiungi un ld.sofile di configurazione /etc/ld.so.conf.d/con il percorso del tuoLD_LIBRARY_PATH

  2. Aggiorna la cache con:

    sudo ldconfig -v
    

Bello, ma la domanda non riguarda Ubuntu. Suggerimento: la prossima volta guarda i tag sotto la domanda.
DavidPostill
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.