Змінні середовища при запуску із 'sudo'


48

Як приклад мого запитання, мій ~/.bashrcфайл містить такі рядки:

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

щоб Numpy (Python) міг знайти бібліотеки, які йому потрібні для запуску, як це будується за допомогою компіляторів MKL та Intel. Цей робочий процес не найкращий, але це вже інша історія.

Моє запитання полягає в тому, як я можу передавати довільні змінні (на зразок тих, що є ~/.bashrc), коли я запускаю програму з 'sudo' (але не root)?

Наразі, якщо я запускаю:

sudo python -c "import numpy"

Я отримую помилку:

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

Деякі пропозиції , як sudo -iі sudo -Eнічого не змінює тут.


Редагувати:

Я не можу відповісти на моє запитання (недостатньо балів: D), але я прокоментую тут, сподіваючись, що є інші новачки в Linux, які задаються питанням про sudoпастки.

[Тільки тимчасово!] Це працює для мене ( ~/.bashrc):

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

Відповіді:


57

Змінні середовища можна просто передати sudoу форму ENV = VALUE, і тоді буде прийнята наступна команда. Мені невідомо, чи є обмеження щодо цього використання, тому мою прикладну проблему можна вирішити за допомогою:

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"


І сьогодні це спрацювало для мене, на моєму Raspbian Jessy для моєї RPi 3 ... після майже тижня зламавши голову, чому мій сценарій не запустився при запуску. Дуже дякую!
DarkCygnus

21

-EВаріант ви згадуєте , здається, працює просто відмінно:

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

Вибачте, але я не розумію вашої відповіді. Чи можете ви навести приклад для сценарію, який я розмістив вище? тобто , щоб мати можливість працювати sudo python -c "import numpy"з LD_LIBRARY_PATHі LD_PRELOADвизначається як написано вище?
зета

2
@zetah: добре, я не маю рації, тому що він працює на загальну змінну, але не для dymanic поєднавши управління змінними, як зазначено в розділі SECURITY NOTESпро sudoйого довідці.
enzotib

Тоді простіше, ніж (як це надано у відповіді), хоча man sudoце не дає зрозуміти, і коли користувач намагається слідувати посиланнями, вказаними там, дуже легко відмовитися від усіх гілок, які потрібно дотримуватися, щоб мати можливість розшифрувати передбачувані значення.
zetah

14

Ви можете використовувати -Eпараметр sudo для збереження поточного середовища (якщо у вас є права на це)

$ 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

Ви повинні редагувати свої sudoersвід sudo visudoяк , можливо , ви плагін політики безпеки включена , який буде мати пріоритет перед PATHпо secure_pathвибору. Тому додайте шлях до списку, і ви також можете використовувати його env_keep, наприклад:

Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"

Щоб перевірити, чи PATHє ваш переопределений, запустіть таку команду:

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

Дивіться також: Чому змінні PATH відрізняються під час роботи через sudo та su? в Unix SE


+1, але env_keepне працює на PATH (у тому сенсі, який sudoвсе ще використовується secure_pathпри пошуку команди)
Zanna

0

Це працює для мене ( ~/.bashrc):

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

Джерело: Згідно редакції ОП


1
це працює, але це погана ідея, оскільки робить біг sudoменш безпечним
Zanna
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.