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

Вы также можете игнорировать ошибку с помощью mysql: INSERT IGNORE INTO TABLE ... он будет игнорировать ошибку ключа, пропустить эту вставку и перейти к следующему.

376
задан codeforester 17 August 2018 в 17:06
поделиться

6 ответов

Хитрость заключается в том, чтобы добавить переменные окружения в файл 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"
288
ответ дан 7 revs, 5 users 41% 17 August 2018 в 17:06
поделиться

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

sudo http_proxy=$http_proxy wget "http://stackoverflow.com"
51
ответ дан buckaroo1177125 17 August 2018 в 17:06
поделиться

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

Defaults env_keep += "http_proxy https_proxy"

Также следует рассмотреть возможность указания env_keep только для одиночная команда как это:

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

22
ответ дан Mark Vrabel 17 August 2018 в 17:06
поделиться

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

# 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
0
ответ дан Wolfgang Fahl 17 August 2018 в 17:06
поделиться

Сначала нужно 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.
436
ответ дан ZachB 17 August 2018 в 17:06
поделиться

Простая функция обертки (или встроенный для цикла)

я предложил уникальное решение потому что:

  • sudo -E "$@" пропускал переменные, который вызывал проблемы для моей команды
  • sudo VAR1="$VAR1" ... VAR42="$VAR42" "$@", было длинно и ужасен в моем случае

Результат demo.sh

#!/bin/bash

function sudo_exports(){
    eval sudo $(for x in 

Простая функция обертки (или встроенный для цикла)

я предложил уникальное решение потому что:

  • sudo -E "$@" пропускал переменные, который вызывал проблемы для моей команды
  • sudo VAR1="$VAR1" ... VAR42="$VAR42" "$@", было длинно и ужасен в моем случае

Результат demo.sh

[110]

$ ./demo.sh
Forty-Two is The Answer to the Ultimate Question of Life, The Universe, and Everything.
Forty-Two is The Answer to the Ultimate Question of Life, The Universe, and Everything.

Как?

Это сделано возможным функцией удара, встроенного printf. Эти %q производит оболочку заключенная в кавычки строка. В отличие от этого расширение параметра в ударе 4.4 , это работает в версиях удара < 4.0

EXPORTS; do printf '%q=%q ' "$x" "${!x}"; done;) "$@" } # create a test script to call as sudo echo 'echo Forty-Two is $VAR42' > sudo_test.sh chmod +x sudo_test.sh export VAR42="The Answer to the Ultimate Question of Life, The Universe, and Everything." 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" # clean function style sudo_exports ./sudo_test.sh # or just use the content of the function eval sudo $(for x in

Простая функция обертки (или встроенный для цикла)

я предложил уникальное решение потому что:

  • sudo -E "$@" пропускал переменные, который вызывал проблемы для моей команды
  • sudo VAR1="$VAR1" ... VAR42="$VAR42" "$@", было длинно и ужасен в моем случае

Результат demo.sh

[110]

$ ./demo.sh
Forty-Two is The Answer to the Ultimate Question of Life, The Universe, and Everything.
Forty-Two is The Answer to the Ultimate Question of Life, The Universe, and Everything.

Как?

Это сделано возможным функцией удара, встроенного printf. Эти %q производит оболочку заключенная в кавычки строка. В отличие от этого расширение параметра в ударе 4.4 , это работает в версиях удара < 4.0

EXPORTS; do printf '%q=%q ' "$x" "${!x}"; done;) ./sudo_test.sh

$ ./demo.sh
Forty-Two is The Answer to the Ultimate Question of Life, The Universe, and Everything.
Forty-Two is The Answer to the Ultimate Question of Life, The Universe, and Everything.

Как?

Это сделано возможным функцией удара, встроенного printf. Эти %q производит оболочку заключенная в кавычки строка. В отличие от этого расширение параметра в ударе 4.4 , это работает в версиях удара < 4.0

0
ответ дан 22 November 2019 в 23:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: