Переменные окружения при запуске с '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...'
zetah
источник

Ответы:

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"
zetah
источник
Тем не менее, сегодня это работало для меня, на моей 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
enzotib
источник
Извините, но я не понимаю вашего ответа. Можете ли вы привести пример сценария, который я разместил выше? т.е. чтобы иметь возможность работать sudo python -c "import numpy"с LD_LIBRARY_PATHи LD_PRELOADопределено как написано выше?
Зета
2
@zetah: хорошо, я не прав, потому что он работает на общую переменную, но не для dymanic увязывания управления переменными, как указано в разделе SECURITY NOTESо sudoстранице руководства.
энзотиб
Проще тогда, что (как в предоставленном ответе), хотя man sudoэто не дает ясности, и когда пользователь пытается следовать ссылкам, указанным там, очень легко быть обескураженным всеми ветвями, которые необходимо соблюдать, чтобы иметь возможность расшифровать предполагаемый смысл.
Зета
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

kenorb
источник
+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