Sudo का उपयोग करते समय पर्यावरण चर कैसे रखें


425

जब मैं sudo के साथ किसी भी कमांड का उपयोग करता हूं तो पर्यावरण चर नहीं होते हैं। HTTP_PROXY सेट करने के बाद उदाहरण के लिए कमांड wgetबिना ठीक काम करता है sudo। हालाँकि अगर मैं sudo wgetयह कहता हूँ कि यह प्रॉक्सी सेटिंग को बायपास नहीं कर सकता है।



जवाबों:


475

सबसे पहले आपको करने की आवश्यकता है 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.

1
महान एकमात्र समस्या है जो आर्क के लिए पेसमैन के लिए उदाहरण के लिए कुछ कॉन्फिग फाइल्स को संशोधित करती है -E पास है
अहमद असवानी

7
Wget के लिए -E (पर्यावरण को संरक्षित करने) की अनुमति देने के लिए, आपको sudo नियम पर SETENV टैग को निर्दिष्ट करने की आवश्यकता है, जो wget को चलाने की अनुमति देता है - उदाहरण: <username> ALL = (root) NOPASSWD: SETENV <wget>
जॉन बोवर्स

65
यह "ई" काम नहीं करता है अगर चर पथ या PYTHONPATH है।
apporc

इसके अलावा किसी भी LC_*चर के साथ काम नहीं करता है । तो बस करो export LOL_FOO=$LC_FOOऔर LOL_FOOबजाय उपयोग करें ।
भाग्योदयकाल

9
यह फ़ाइल PATHमें एक तत्व जोड़ने के सरल मामले के साथ काम नहीं किया .bashrc- कहते हैं export PATH=myPath:$PATH,। यदि मैं टाइप करता हूं sudo -E bash -c 'echo $PATH', तो PATHmyPath शामिल नहीं करता है क्योंकि कॉल करने sudoसे PATHपहले ही स्थानीय मान को अक्षम कर दिया गया है bash। बल्कि, मैंने नीचे दिए गए जवाब में stackoverflow.com/a/33183620/5459638 को प्रभावी पाया , वह हैsudo PATH=$PATH command
XavierStuvw

310

चाल के sudoersमाध्यम से फाइल करने के लिए पर्यावरण चर जोड़ने के लिए हैsudo visudo आदेश के जोड़ने और इन पंक्तियों को जोड़ने के लिए है:

Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"

से लिया गया आर्कलिनक्स विकी

Ubuntu 14 के लिए, आपको अलग-अलग लाइनों में निर्दिष्ट करने की आवश्यकता है क्योंकि यह बहु-चर लाइनों के लिए त्रुटियों को लौटाता है:

Defaults  env_keep += "http_proxy"
Defaults  env_keep += "https_proxy"
Defaults  env_keep += "HTTP_PROXY"
Defaults  env_keep += "HTTPS_PROXY"

11
यकीनन यह सबसे अच्छा विकल्प है, सूचना रिसाव और सुरक्षा छेद से बचने के लिए। sudo -Eएडहॉक के लिए निश्चित रूप से आग लगने का एक ही प्रभाव के लिए एक ही प्रभाव है, हालांकि
sehe

मुझे एक प्रक्रिया की समस्या का सामना करना पड़ा, जो sudo (jhbuild) कहती है और मैं इसे sudo को -E ध्वज को पास करने के लिए नहीं कह सकता, इसलिए यह मेरा समाधान है।
jgomo3

60
ध्यान दें कि आपको कभी भी etc/sudoersसीधे संपादित नहीं करना चाहिए । इसके बजाय, visudoकमांड का उपयोग करें , जो sudoersफ़ाइल को अधिलेखित करने से पहले आपके संपादन को सिंटैक्स-चेक करता है । इस प्रकार, यदि आप संपादन करते समय कोई गलती करते हैं, तो आप अपने आप को लॉक नहीं करते हैं।
हेनिंग

1
अपरकेस env var का उपयोग करने पर विचार करें। मेरे मामले में HTTP_PROXY और HTTPS_PROXY के उपयोग ने चाल चली।
पाबू

2
लोअरकेस वेरिएंट मेरे अनुभव से बेहतर है क्योंकि यह विग और कर्ल दोनों में काम करता है।
मिरोस्लाव मूसक

57

अलग-अलग वैरिएबल के लिए जिसे आप एक बार बंद करके उपलब्ध कराना चाहते हैं, आप इसे कमांड का हिस्सा बना सकते हैं।

sudo http_proxy=$http_proxy wget "http://stackoverflow.com"

मैंने इस उत्तर को फ़ाइल में packageजोड़े गए कुछ myPath के तहत ( क्लॉस के साथ ) परीक्षण किया है। फिर , इसके विपरीत सही उत्तर पाता है । हालाँकि, इससे आगे नहीं जाता (फ़ाइल नहीं मिली)। दूसरी ओर, खोल से एक मैदान का शुभारंभ विस्तारित पथ को संरक्षित करता है और सूडो अधिकार (एक पत्थर के साथ दो कबूतर) देता है। तो प्रतिक्रिया वास्तव में इस बात पर निर्भर करती है कि आप कौन सी कमांड शुरू कर रहे हैंPATH.bashrcexportsudo PATH=$PATH which packagesudo which packagesudo PATH=$PATH packagesudo packagepackagesudo bashpackage
जेवियरस्ट्यूव

2
सुडो के लिए पथ संकल्प एक और मामला है - क्या किसी को इस मामले की खोज में मुझे यह पता लगाने की सलाह देनी चाहिए कि मुझे unix.stackexchange.com/questions/83191/…
buckaroo1177125

24

आप env_keepअहमद असवानी के दो बयानों को इस तरह से एक ही बयान में जोड़ सकते हैं :

Defaults env_keep += "http_proxy https_proxy"

आपको निर्दिष्ट करने पर भी विचार करना चाहिए env_keep इस तरह केवल एक ही कमांड के लिए :

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


1

एक साधारण आवरण समारोह (या लूप के लिए इन-लाइन)

मैं एक अद्वितीय समाधान के साथ आया क्योंकि:

  • 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;) "$@"
}

# 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 $_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

यदि आपको स्क्रिप्ट में पर्यावरण चर रखने की आवश्यकता है, तो आप इस तरह से एक दस्तावेज़ में अपनी कमांड डाल सकते हैं। खासकर अगर आपके पास चीजें सेट करने के लिए बहुत सारे चर हैं तो इस तरह से साफ दिखें।

# 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.