Переменная среды, похоже, не работает в sudo

Я использую apt за брандмауэром, поэтому я указываю прокси в http_proxy среды http_proxy .

Что я сделал, добавлена ​​следующая строка для .profile и .bashrc (для хорошей оценки) пользователя root:

 export http_proxy=http://proxyserver:8080 

Когда я делаю следующее, он правильно печатает значение прокси:

 sudo echo $http_proxy 

Тем не менее, когда я вызываю sudo apt-get update , он, похоже, не видит переменную http_proxy в качестве пользователя root.

Только когда я su для root, apt-get работает, как и ожидалось, через прокси-сервер, поэтому он явно видит переменную.

Итак, мой вопрос, как и выше, почему sudo apt-get не видит переменную?

ОБНОВЛЕНИЕ Я только что узнал, что, когда я вызываю sudo echo , он повторяет значение переменной, заданной в профиле текущего пользователя. Но даже в этом случае, почему sudo apt-get не использует эту переменную?

Он не работает «не работает» в случае sudo apt-get , похоже, работает, когда вы выполняете sudo echo $http_proxy .

Когда вы вводите команду оболочки, она globs и расширяет все переменные и псевдонимы, прежде чем она будет выполнена.

Итак, sudo echo $http_proxy становится sudo echo http://proxyserver:8080 который проходит через штраф.

Причина $http_proxy не видна apt-get , потому что sudo очищает все переменные среды, кроме тех, которые явно указаны в /etc/sudoers с директивой env_keep .

Дополнительная информация о том, как манипулировать тем, как sudo обрабатывает переменные окружения (точнее, как обычно это не так ), можно найти в man sudoers .

Просто чтобы вы знали, потому что это то, о чем я остановился, будучи конкретным для этого случая и поэтому лучшим решением является изменение /etc/apt/apt.conf чтобы добавить строку для прокси:

 Acquire::http::Proxy "http://yourproxyaddress:proxyport"; 

Поскольку эта система постоянно находится на постоянной основе за прокси-сервером, это лучшее решение, чем использование http_proxy окружения http_proxy в долгосрочной перспективе.

Ах, я только что что-то видел на этой странице:

https://help.ubuntu.com/community/AptGet/Howto#Setting_up_apt-get_to_use_a_http-proxy

Если вы обычно используете sudo для запуска apt-get, вам нужно сначала войти в систему как root, чтобы это работало, если вы также не добавляете некоторые явные настройки среды в / etc / sudoers, например

Defaults env_keep = "http_proxy https_proxy ftp_proxy"

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

Как уже указывалось, sudo очищает пользовательские переменные среды, заданные пользователем.

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

 export http_proxy='http://proxyserver:8080' sudo sh -c 'export "${1}"; echo "$http_proxy"; apt-get update' _ "http_proxy=${http_proxy}" 

Я думаю, что вам просто нужно использовать параметр -E для sudo, например

 sudo -E echo $http_proxy