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

Как пример моего вопроса, мой ~/.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...'

5 ответов

Решение

Переменные среды могут быть просто переданы после 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=dummy
enzotib@host:~$ sudo -E sh -c 'echo $DUMMY'
dummy
enzotib@host:~$ sudo -E env | grep DUMMY
DUMMY=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_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

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

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

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

Другие вопросы по тегам