Zmienne środowiskowe po uruchomieniu z „sudo”

48

Jako przykład mojego pytania mój ~/.bashrcplik zawiera następujące wiersze:

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

aby Numpy (Python) mógł znaleźć biblioteki, które musi uruchomić, ponieważ jest budowany z kompilatorami MKL i Intel. Ten przepływ pracy nie jest najlepszy, ale to już inna historia.

Moje pytanie brzmi: w jaki sposób mogę przekazać dowolne zmienne (takie jak te w ~/.bashrc), kiedy uruchamiam program z 'sudo' (ale nie rootem)?

Obecnie, jeśli uruchomię:

sudo python -c "import numpy"

Dostaję błąd:

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

Niektóre sugestie co sudo -ialbo sudo -Enie robi nic tu zmienić.


Edytować:

Nie mogę odpowiedzieć na moje pytanie (za mało punktów: D), ale skomentuję tutaj, mając nadzieję, że inni początkujący użytkownicy Linuksa zastanawiają się nad sudopułapkami.

[Tylko tymczasowo!] To działa dla mnie ( ~/.bashrc):

alias sudo='sudo env PATH=$PATH VAR1=SOME_VALUE VAR2=SOME_VALUE...'
zetah
źródło

Odpowiedzi:

57

Zmienne środowiskowe można po prostu przekazać sudow postaci ENV = WARTOŚĆ i zostaną zaakceptowane przez polecenie follow. Nie wiadomo mi, czy istnieją ograniczenia w tym użyciu, więc mój przykładowy problem można rozwiązać za pomocą:

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
źródło
Jeszcze dzisiaj to działało dla mnie, na moim Raspbian Jessy dla mojego RPi 3 ... po prawie tygodniu łamania mi głowy, dlaczego mój skrypt nie uruchomił się przy starcie. Wielkie dzięki!
DarkCygnus,
21

Wspomniana -Eopcja wydaje się działać dobrze:

enzotib@host:~$ export DUMMY=dummy
enzotib@host:~$ sudo -E sh -c 'echo $DUMMY'
dummy
enzotib@host:~$ sudo -E env | grep DUMMY
DUMMY=dummy
enzotib
źródło
Przepraszam, ale nie rozumiem twojej odpowiedzi. Czy możesz podać przykład scenariusza, który opublikowałem powyżej? to znaczy, aby móc uruchomić sudo python -c "import numpy"z LD_LIBRARY_PATHi LD_PRELOADzdefiniowane jako napisane powyżej?
zetah,
2
@zetah: Ok, ja się mylę, ponieważ działa na zmiennej generycznych, ale nie za dynamiczny łączących kontrolowania zmiennych, jak wskazano w punkcie SECURITY NOTESna sudostronie podręcznika.
enzotib
Łatwiej jest wtedy (jak w podanej odpowiedzi), chociaż man sudonie wyjaśnia tego, a kiedy użytkownik próbuje zastosować wskazane tam referencje, bardzo łatwo jest zniechęcić się wszystkimi gałęziami, których należy przestrzegać, aby móc odszyfrować przypuszczalne znaczenie.
zetah,
14

Możesz użyć -Eopcji sudo, aby zachować obecne środowisko (jeśli masz do tego uprawnienia)

$ 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
źródło
8

Trzeba zmieniać swoich sudoersprzez sudo visudoco prawdopodobnie masz włączoną wtyczkę polityki bezpieczeństwa, która będzie używana zamiast PATHprzez secure_pathopcję. Dodaj ścieżkę do listy, a env_keepzamiast tego możesz również użyć , na przykład:

Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"

Aby sprawdzić, czy twój PATHjest przesłonięty, uruchom następujące polecenie:

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

Zobacz także: Dlaczego zmienne PATH różnią się podczas uruchamiania przez sudo i su? w Unix SE

kenorb
źródło
+1, ale env_keepnie działa na ŚCIEŻCE (w tym sensie, że sudonadal używa go secure_path, szukając polecenia)
Zanna
0

To działa dla mnie ( ~/.bashrc):

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

Źródło: zgodnie z edycją OP

Kenorb
źródło
1
to działa, ale jest to zły pomysł, ponieważ sprawia, że ​​bieganie jest sudomniej bezpieczne
Zanna