Когда я использую любую команду с sudo, переменные окружения отсутствуют. Например, после установки HTTP_PROXY команда wget прекрасно работает без sudo. Однако, если я ввожу sudo wget, команда говорит, что не может обойти настройки прокси. Что делать?
Ответ 1
Во-первых, вам нужно экспортировать HTTP_PROXY. Во-вторых, вам нужно внимательно прочитать руководство по команде «sudo» и обратить внимание на флаг -E.
$ export HTTP_PROXY=foof
$ sudo -E bash -c 'echo $HTTP_PROXY'
Вот цитата из руководства:
-E, --preserve-env
Указывает политике безопасности, что пользователь хочет сохранить свои существующие переменные окружения.
Политика безопасности может вернуть ошибку, если у пользователя нет разрешения на сохранение переменных окружения.
Ответ 2
Хитрость заключается в том, чтобы добавить переменные среды в файл sudoers с помощью команды sudo visudo и добавить эти строки:
Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy".
Для Ubuntu вам нужно указать это в отдельных строках, так как команда возвращает ошибки для строк с несколькими переменными:
Defaults env_keep += "http_proxy"
Defaults env_keep += "https_proxy"
Defaults env_keep += "HTTP_PROXY"
Defaults env_keep += "HTTPS_PROXY"
Ответ 3
Простая функция-обертка. Я использую уникальное решение, которое работает следующим образом:
sudo -E "$@"
sudo VAR1="$VAR1" ... VAR42="$VAR42" "$@"
demo.sh
#!/bin/bash
function sudo_exports(){
eval sudo $(for x in $_EXPORTS; do printf '%q=%q ' "$x" "${!x}"; done;) "$@"
}
# создайте тестовый скрипт для вызова от имени sudo
echo 'echo Сорок два - $VAR42' > sudo_test.sh
chmod +x sudo_test.sh
export VAR42="Какая-то тестовая строка…".
export _EXPORTS="_EXPORTS VAR1 VAR2 VAR3 VAR4 VAR5 VAR6 VAR7 VAR8 VAR9 VAR10 VAR11 VAR12 VAR13 VAR14 VAR15 VAR16 VAR17 VAR18 VAR19 VAR20 VAR21 VAR22 VAR23 VAR24 VAR25 VAR26 VAR27 VAR28 VAR29 VAR30 VAR31 VAR32 VAR33 VAR34 VAR35 VAR36 VAR37 VAR38 VAR39 VAR40 VAR41 VAR42"
# чистый стиль функции
sudo_exports ./sudo_test.sh
# или просто используйте содержимое функции
eval sudo $(for x in $_EXPORTS; do printf '%q=%q ' "$x" "${!x}"; done;) ./sudo_test.sh
Это стало возможным благодаря свойству встроенного в bash printf. Функция %q создает строку, заключенную в кавычки. В отличие от расширения параметров в bash 4.4, это работает в версиях bash < 4.0
Ответ 4Если вам нужно сохранить переменные окружения в сценарии, вы можете поместить свою команду в некоторый документ. Особенно если у вас много переменных, которые нужно установить, все выглядит аккуратно.
# подготовить скрипт, например, для запуска maven
runmaven=/tmp/runmaven$$
# создайте скрипт с помощью документа
cat << EOF > $runmaven
#!/bin/bash
# запустить чистый maven с установленными переменными окружения
export ANT_HOME=/usr/share/ant
export MAKEFLAGS=-j4
mvn clean install
EOF
# сделайте скрипт исполняемым
chmod +x $runmaven
# запустите его
sudo $runmaven
# удалите его или закомментируйте
rm $runmaven
Linux