Variabili d'ambiente quando eseguite con 'sudo'


48

Come esempio per la mia domanda, il mio ~/.bashrcfile contiene queste righe:

export LD_LIBRARY_PATH=/opt/intel/mkl/lib/ia32:$LD_LIBRARY_PATH
export LD_PRELOAD=/opt/intel/mkl/lib/ia32/libmkl_core.so

in modo che Numpy (Python) possa trovare le librerie che deve eseguire, poiché è compilato con compilatori MKL e Intel. Questo flusso di lavoro non è il migliore, ma questa è un'altra storia.

La mia domanda è: come posso passare variabili arbitrarie (come quelle in ~/.bashrc) quando eseguo il programma con 'sudo' (ma non root)?

Attualmente, se corro:

sudo python -c "import numpy"

Ottengo un errore:

ImportError: libimf.so: cannot open shared object file: No such file or directory*

Alcuni suggerimenti come sudo -io sudo -Enon cambia nulla qui.


Modificare:

Non posso rispondere alla mia domanda (non abbastanza punti: D) ma commenterò qui, nella speranza che ci siano altri neofiti di Linux che si chiedono sudotrappole.

[Solo temporaneamente!] Questo funziona per me ( ~/.bashrc):

alias sudo='sudo env PATH=$PATH VAR1=SOME_VALUE VAR2=SOME_VALUE...'

Risposte:


57

Le variabili d'ambiente possono essere semplicemente passate dopo sudoin forma ENV = VALUE e saranno accettate dal comando seguito. Non mi è noto se ci sono restrizioni a questo utilizzo, quindi il mio problema di esempio può essere risolto con:

sudo LD_LIBRARY_PATH=/opt/intel/mkl/lib/ia32:$LD_LIBRARY_PATH LD_PRELOAD=/opt/intel/mkl/lib/ia32/libmkl_core.so python -c "import numpy"


Ancora oggi ha funzionato per me, sulla mia Raspbian Jessy per il mio RPi 3 ... dopo quasi una settimana che mi ha spezzato la testa perché la mia sceneggiatura non è stata eseguita all'avvio. Molte grazie!
DarkCygnus,

21

L' -Eopzione che menzioni sembra funzionare bene:

enzotib@host:~$ export DUMMY=dummy
enzotib@host:~$ sudo -E sh -c 'echo $DUMMY'
dummy
enzotib@host:~$ sudo -E env | grep DUMMY
DUMMY=dummy

Scusa, ma non capisco la tua risposta. Potete fornire esempi sullo scenario che ho pubblicato sopra? cioè essere in grado di correre sudo python -c "import numpy"con LD_LIBRARY_PATHe LD_PRELOADdefinito come scritto sopra?
zetah,

2
@zetah: ok, sbaglio, perché funziona per variabili generiche, ma non per variabili di controllo del collegamento dymanic, come indicato nella sezione SECURITY NOTESdella sudopagina del manuale.
enzotib,

È più semplice che (come nella risposta fornita), anche man sudose non lo chiarisce, e quando l'utente tenta di seguire i riferimenti puntati lì, è molto facile scoraggiarsi da tutti i rami che devono essere seguiti, per poter decifrare supposto senso.
zetah,

14

È possibile utilizzare l' -Eopzione sudo per preservare l'ambiente corrente (se si dispone dei diritti per farlo)

$ man sudo
 -E, --preserve-env
             Indicates to the security policy that the user wishes to preserve
             their existing environment variables.  The security policy may
             return an error if the user does not have permission to preserve
             the environment.

8

È necessario modificare il sudoersda sudo visudocome probabilmente hai plugin di politica di sicurezza abilitato che prevale PATHper secure_pathl'opzione. Quindi aggiungi il percorso all'elenco e puoi anche usare env_keep, ad esempio:

Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"

Per verificare se il tuo PATHè sovrascritto, esegui il seguente comando:

$ sudo sudo -V | grep PATH
Value to override user's $PATH with: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Vedi anche: Perché le variabili PATH sono diverse quando si esegue tramite sudo e su? presso Unix SE


+1, ma env_keepnon funziona su PATH (nel senso che sudoutilizza ancora secure_pathquando si cerca il comando)
Zanna

0

Questo funziona per me ( ~/.bashrc):

alias sudo='sudo env PATH=$PATH VAR1=SOME_VALUE VAR2=SOME_VALUE...'

Fonte: come da modifica OP


1
funziona, ma è una cattiva idea perché rende la corsa sudomeno sicura
Zanna,
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.