Когда я использую любую команду с sudo, переменных среды там нет. Например, после установки HTTP_PROXY команда wget
работает нормально без sudo
. Однако, если я набираю, sudo wget
он говорит, что не может обойти настройку прокси.
linux
environment-variables
sudo
Ахмед Асуани
источник
источник
Ответы:
Сначала тебе нужно
export HTTP_PROXY
. Во-вторых, вы должныman sudo
внимательно прочитать и обратить внимание на-E
флаг. Это работает:Вот цитата из справочной страницы:
источник
LC_*
переменной. Так что просто делайтеexport LOL_FOO=$LC_FOO
и используйтеLOL_FOO
вместо этого.PATH
в.bashrc
файле - скажем,export PATH=myPath:$PATH
. Если я наберуsudo -E bash -c 'echo $PATH'
, тоPATH
не содержит myPath, вероятно, потомуsudo
что уже отключил локальное значениеPATH
перед вызовомbash
. Скорее, я нашел ответ ниже stackoverflow.com/a/33183620/5459638 эффективным, то естьsudo PATH=$PATH command
Хитрость заключается в том, чтобы добавить переменные среды в
sudoers
файл с помощьюsudo visudo
команды и добавить следующие строки:взято из ArchLinux вики .
Для Ubuntu 14 вам нужно указывать в отдельных строках, так как он возвращает ошибки для строк с несколькими переменными:
источник
sudo -E
это верный способ добиться того же эффекта для одноразового, хотяetc/sudoers
напрямую. Вместо этого используйтеvisudo
команду, которая синтаксически проверяет ваши изменения перед перезаписьюsudoers
файла. Таким образом, вы не заблокируете себя, если допустите ошибку при редактировании.Для отдельных переменных, которые вы хотите сделать доступными по отдельности, вы можете сделать это частью команды.
источник
package
под myPath, добавленнымPATH
в.bashrc
файл (сexport
клаузулой). Затемsudo PATH=$PATH which package
находит правильный ответ, в отличие отsudo which package
. Темsudo PATH=$PATH package
не менее, не идет дальше, чемsudo package
(файл не найден). С другой стороны, запуск равниныpackage
из оболочки, вызванной с помощью,sudo bash
сохраняет расширенный путь и даетpackage
права sudo (два голубя с одним камнем). Таким образом, ответ действительно зависит от того, какие команды вы запускаетеВы также можете объединить два
env_keep
утверждения в ответе Ахмеда Асуани в одно утверждение, подобное этому:Defaults env_keep += "http_proxy https_proxy"
Вам также следует рассмотреть возможность указания
env_keep
только для одной команды, подобной этой:Defaults!/bin/[your_command] env_keep += "http_proxy https_proxy"
источник
Простая функция-обертка (или встроенная в цикл)
Я придумал уникальное решение, потому что:
sudo -E "$@"
текла переменные, которые вызывали проблемы для моей командыsudo VAR1="$VAR1" ... VAR42="$VAR42" "$@"
было долго и некрасиво в моем случаеdemo.sh
Результат
Как?
Это стало возможным благодаря функции встроенного в bash
printf
.%q
Производит оболочки кавычек. В отличие от расширения параметров в bash 4.4 , это работает в версиях bash <4.0источник
Если вам нужно сохранить переменные окружения в скрипте, вы можете поместить свою команду в документ здесь, например так. Особенно, если у вас много переменных, чтобы все выглядело аккуратно.
источник