Переменные окружения при запуске с помощью 'sudo'

В качестве примера к моему вопросу, мой ~/.bashrc файл содержит следующие строки:

export LD_LIBRARY_PATH=/opt/intel/mkl/lib/ia32:$LD_LIBRARY_PATHexport 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...'

Переменные среды могут быть просто переданы после 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"

То -E вариант, который вы упомянули, кажется, работает просто отлично:

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

Вы можете использовать -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.

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

Defaults env_resetDefaults env_keep += "PATH PYTHONPATH"

Чтобы проверить, является ли ваш PATH переопределен, выполните следующую команду:

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

Смотрите также: Почему переменные ПУТИ различаются при запуске через sudo и su? в Unix SE

Это работает для меня (~/.bashrc):

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

Источник: Согласно OP редактировать