Linux

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

Когда я использую любую команду с 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

Как мне запросить ввод Да/Нет/Отмена в сценарии оболочки Linux

Linux

Как объединить две статические библиотеки «ar» в одну

Как пользоваться Wine: основы работы для начинающих и полезные советы
Linux

Как пользоваться Wine: основы работы для начинающих и полезные советы

Linux

Как сделать переадресацию портов с одного IP на другой в одной и той же сети?

×