Как сохранить переменные окружения при использовании sudo - PullRequest
372 голосов
/ 26 декабря 2011

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

Ответы [ 5 ]

431 голосов
/ 26 декабря 2011

Сначала нужно 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.
285 голосов
/ 26 декабря 2011

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

Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"

взято с ArchLinux wiki .

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

Defaults  env_keep += "http_proxy"
Defaults  env_keep += "https_proxy"
Defaults  env_keep += "HTTP_PROXY"
Defaults  env_keep += "HTTPS_PROXY"
51 голосов
/ 17 октября 2015

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

sudo http_proxy=$http_proxy wget "http://stackoverflow.com"
22 голосов
/ 12 декабря 2013

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

Defaults env_keep += "http_proxy https_proxy"

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

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

0 голосов
/ 25 июня 2019

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

# 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=-j4
mvn clean install
EOF
# make the script executable
chmod +x $runmaven
# run it
sudo $runmaven
# remove it or comment out to keep
rm $runmaven
...