Как сохранить переменные окружения при использовании sudo

Когда я использую любую команду с sudo, переменных среды там нет. Например, после установки HTTP_PROXY команда wget работает нормально без sudo. Однако, если я sudo wget он скажет, что не может обойти настройку прокси.

Ответ 1

Трюк заключается в том, чтобы добавить переменные среды в файл sudoers с помощью команды sudo visudo и добавить следующие строки:

Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"

взято из вики ArchLinux.

Для Ubuntu 14 вам нужно указать в отдельных строках, поскольку он возвращает ошибки для строк с несколькими переменными:

Defaults  env_keep += "http_proxy"
Defaults  env_keep += "https_proxy"
Defaults  env_keep += "HTTP_PROXY"
Defaults  env_keep += "HTTPS_PROXY"

Ответ 2

Сначала вам нужно export HTTP_PROXY. Во-вторых, вам нужно внимательно прочитать man sudo и обратить внимание на флаг -E. Это работает:

$ export HTTP_PROXY=foof
$ sudo -E bash -c 'echo $HTTP_PROXY'

Вот цитата из справочной страницы:

-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.

Ответ 3

Для отдельных переменных, которые вы хотите сделать доступными на одном уровне, вы можете сделать это частью команды.

sudo http_proxy=$http_proxy wget "http://stackoverflow.com"

Ответ 4

Вы также можете комбинировать два оператора env_keep в сообщении Ахмеда Асвани в одном утверждении:

Defaults env_keep += "http_proxy https_proxy"

Вы также должны рассмотреть указание env_keep только для одной команды:

Defaults!/bin/[your_command] env_keep += "http_proxy https_proxy"

Ответ 5

Если вам нужно сохранить переменные окружения в скрипте, вы можете поместить свою команду в документ здесь, например так. Особенно, если у вас много переменных, чтобы все выглядело аккуратно.

# prepare a script e.g. for running maven
runmaven=/tmp/runmaven$$
# create the script with a here document 
cat << EOF > $runmaven
#!/bin/bash
# run the maven clean with environment variables set
export ANT_HOME=/usr/share/ant
export MAKEFLAGS=-jX
mvn clean install
EOF
# make the script executable
chmod +x $runmaven
# run it
sudo $runmaven
# remove it or comment out to keep
rm $runmaven