Umgebungsvariablen bei Ausführung mit 'sudo'

48

Als Beispiel für meine Frage ~/.bashrcenthält meine Datei folgende Zeilen:

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

damit Numpy (Python) Bibliotheken finden kann, die es ausführen muss, da es mit MKL- und Intel-Compilern erstellt wurde. Dieser Workflow ist nicht der beste, aber das ist eine andere Geschichte.

Meine Frage ist, wie kann ich beliebige Variablen (wie die in ~/.bashrc) übergeben, wenn ich ein Programm mit 'sudo' (aber nicht root) starte?

Derzeit, wenn ich laufe:

sudo python -c "import numpy"

Ich erhalte einen Fehler:

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

Einige Vorschläge als sudo -ioder sudo -Eändern hier nichts.


Bearbeiten:

Ich kann meine Frage nicht beantworten (nicht genug Punkte: D), aber ich werde mich hier äußern, in der Hoffnung, dass sich andere Linux-Neulinge über sudoFallen wundern .

[Nur vorübergehend!] Das funktioniert bei mir ( ~/.bashrc):

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

Antworten:

57

Umgebungsvariablen können einfach sudoin der Form ENV = VALUE übergeben werden und werden von folgendem Befehl akzeptiert. Es ist mir nicht bekannt, ob es Einschränkungen bei dieser Verwendung gibt, sodass mein Beispielproblem gelöst werden kann mit:

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"
Zetah
quelle
Noch heute funktionierte das für mich, auf meinem Raspbian Jessy für mein RPi 3 ... nach fast einer Woche Kopfschmerzen, warum lief mein Skript beim Start nicht. Danke vielmals!
DarkCygnus
21

Die -EOption, die Sie erwähnen, scheint gut zu funktionieren:

enzotib@host:~$ export DUMMY=dummy
enzotib@host:~$ sudo -E sh -c 'echo $DUMMY'
dummy
enzotib@host:~$ sudo -E env | grep DUMMY
DUMMY=dummy
Enzotib
quelle
Entschuldigung, aber ich verstehe deine Antwort nicht. Können Sie ein Beispiel für ein Szenario geben, das ich oben gepostet habe? dh in der Lage sein zu laufen sudo python -c "import numpy"mit LD_LIBRARY_PATHund LD_PRELOADdefiniert , wie oben geschrieben?
Zetah
2
@zetah: ok, ich liege falsch, weil es für generische Variablen funktioniert, aber nicht für dynamische Verknüpfungssteuerungsvariablen, wie im Abschnitt SECURITY NOTESder sudoHandbuchseite angegeben.
Enzotib
Es ist dann einfacher, dass (wie in der angegebenen Antwort), obwohl man sudodies nicht klar macht, und wenn der Benutzer versucht, den dort angegebenen Referenzen zu folgen, es sehr leicht ist, sich von allen zu befolgenden Zweigen entmutigen zu lassen, um vermeintlich entschlüsseln zu können Bedeutung.
Zetah
14

Sie können die -Esudo-Option verwenden, um die aktuelle Umgebung beizubehalten (sofern Sie dazu berechtigt sind).

$ 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.
Eugen Konkov
quelle
8

Sie benötigen zu bearbeiten , sudoersindem sudo visudoals möglicherweise haben Sicherheitspolitik Plugin aktiviert Sie , die Ihre überschreibt PATHdurch secure_pathOption. Fügen Sie den Pfad zur Liste hinzu, und verwenden Sie env_keepstattdessen beispielsweise Folgendes:

Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"

PATHFühren Sie den folgenden Befehl aus, um zu überprüfen, ob Ihre überschrieben wurde:

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

Siehe auch: Warum unterscheiden sich PATH-Variablen bei der Ausführung über sudo und su? bei Unix SE

Kenorb
quelle
+1, env_keepfunktioniert aber nicht auf PFAD (in dem Sinne, der sudonoch secure_pathbei der Suche nach dem Befehl verwendet wird)
Zanna
0

Das funktioniert bei mir ( ~/.bashrc):

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

Quelle: Gemäß OP edit

Kenorb
quelle
1
Dies funktioniert, aber es ist eine schlechte Idee, weil es das Laufen sudoweniger sicher macht
Zanna