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

Как передать произвольные переменные (например, в ~/.bashrc), когда я запускаю программу с 'sudo' (но не root)?

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

[Только временно!] Это работает для меня (~/.bashrc):

alias sudo='sudo env PATH=$PATH VAR1=SOME_VALUE VAR2=SOME_VALUE...'
1
задан 30 April 2015 в 11:50

4 ответа

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

enzotib@host:~$ export DUMMY=dummy
enzotib@host:~$ sudo -E sh -c 'echo $DUMMY'
dummy
enzotib@host:~$ sudo -E env | grep DUMMY
DUMMY=dummy
14
ответ дан 25 May 2018 в 19:14
  • 1
    Извините, но я не понимаю вашего ответа. Можете ли вы привести пример по сценарию, который я написал выше? то есть иметь возможность запускать sudo python -c "import numpy" с LD_LIBRARY_PATH и LD_PRELOAD, как указано выше? – zetah 20 August 2011 в 12:24
  • 2
    @zetah: хорошо, я ошибаюсь, потому что он работает для общей переменной, но не для динамического связывания управляющих переменных, как указано в разделе SECURITY NOTES справочной страницы sudo. – enzotib 20 August 2011 в 12:52
  • 3
    Это проще (как в предоставленном ответе), хотя man sudo не дает понять, и когда пользователь пытается следовать ссылкам, указанным там, очень легко обескураживать все ветви, которые необходимо соблюдать, чтобы иметь возможность расшифровать предполагаемое значение. – zetah 20 August 2011 в 14:23

Вы можете использовать опцию -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
ответ дан 25 May 2018 в 19:14

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

Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"

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

[ f2]

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

5
ответ дан 25 May 2018 в 19:14
  • 1
    +1, но env_keep не работает в PATH (в том смысле, что sudo по-прежнему использует secure_path при поиске команды) – Zanna 13 April 2018 в 22:39

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

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

Источник: согласно OP edit

0
ответ дан 25 May 2018 в 19:14
  • 1
    это работает, но это плохая идея, потому что она делает работу sudo менее безопасной – Zanna 13 April 2018 в 22:49

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

Похожие вопросы: