कैसे sudo su के लिए पर्यावरण चर पारित करने के लिए


30

मुझे मूल रूप से ऐसा करने की आवश्यकता है:

DUMMY=dummy
sudo su - ec2-user -c 'echo $DUMMY'

यह काम नहीं करता है। मैं सु में env चर $ DUMMY कैसे पास कर सकता हूं? -p, -l के साथ काम नहीं करता है।


बस के बारे में क्या sudo -iu ec2-user echo $DUMMY?
मूरू

जवाबों:


39

आप इसे बिना लॉगिन शेल के कॉल कर सकते हैं:

sudo DUMMY=dummy su ec2-user -c 'echo "$DUMMY"'

या:

sudo DUMMY=dummy su -p - ec2-user -c 'echo "$DUMMY"'

कमांड का -pविकल्प suपर्यावरण चर को संरक्षित करता है।


3
मुझे लगता है कि "-ई" पर्यावरण चर को बनाए रखता है sudo.ws/man/sudo.man.html
एंडी

1
@Andy लेकिन यह अक्सर sudo कॉन्फ़िगरेशन द्वारा निषिद्ध है।
गिल्स एसओ- बुराई को रोकना '

@cuonglm - धन्यवाद। यह काम। लॉगिन शेल नहीं बुलाया जाना चाहिए।
उमंग

1
@kenorb: नहीं, इस मामले में -pविकल्प suनहीं sudoहै
cuonglm

अन्य सूत्र हैं जो कहते -mहैं कि चर को संरक्षित करता है, अन्य कहते हैं -cकि अंतर क्या है? और इस उत्तर दिनों में एक टिप्पणी -E stackoverflow.com/questions/10488758/…
विश्रांत

49

प्रो टिप: वास्तव में चलाने का एक अच्छा कारण कभी नहीं हैsudo su । एक अलग उपयोगकर्ता के रूप में एक कमांड चलाने के लिए, का उपयोग करें sudo -u username command। यदि आप एक रूट शेल चाहते हैं, तो चलाएं sudo -iया sudo -l। यदि आपने रूट खाता सक्रिय कर दिया है, तो आप suअकेले भी चल सकते हैं, लेकिन sudo suबस उपयोगी नहीं है। और हां, मुझे पता है कि आप इसे हर जगह देखते हैं।

जिसके अनुसार, sudoहै -Eस्विच जो उपयोगकर्ता के सत्र की पर्यावरण के संरक्षण होगा:

 -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.

तो, आपको पहले अपना चर निर्यात करना होगा, और फिर चलाना होगा sudo -E:

$ export DUMMY=dummy
$ sudo -Eu bob bash -c 'echo $DUMMY'
dummy

की bash -cजरूरत नहीं है। हालाँकि, अगर मैं चलाता हूं, तो sudo -Eu bob echo "$DUMMY"रूट शेल लॉन्च होने से पहले वेरिएबल का विस्तार किया जाता है ताकि यह प्रदर्शित न हो कि कमांड वास्तव में काम करता है:

$ sudo -u bob echo $DUMMY  ## looks like it works but doesn't
dummy
$ sudo -u bob bash -c 'echo D:$DUMMY' ## now we see it failed
D:
$ sudo -Eu bob bash -c 'echo D:$DUMMY'  ## works as expected
D:dummy

2
एक वातावरण चर को बचाने के लिये एक बेहतर तरीका में जोड़ने के लिए है env_keepमें sudoers। शायद इस तरह Defaults env_keep += "DUMMY":।
lcd047

@ lcd047 लेकिन उस के लिए पर्यावरण के संरक्षण होगा सब के आमंत्रण sudo। यह एकल चर के लिए अधिक बोझिल भी है। यह केवल उस चीज के लिए उपयोगी है जिसे हमेशा निर्यात किया जाना चाहिए।
terdon

हां, यह एक व्यापार बंद है, लेकिन सभी पर्यावरण चर समान रूप से हानिकारक नहीं हैं। वहाँ ले जाने LD_PRELOADऔर ले जाने के बीच एक पर्याप्त अंतर है LESSCHARDEF। मुझे नहीं लगता कि सुविधा को जीतने वाला तर्क होना चाहिए ...
lcd047

1
@ lcd047 आपका सुझाव निश्चित रूप से उत्तर के रूप में पोस्ट करने लायक है। मेरा कहना है कि यह मनमाना चर निर्यात करने के लिए व्यावहारिक नहीं है। हां, यदि कोई विशिष्ट चर है जिसे आप हमेशा निर्यात करना चाहते हैं, तो यह जाने का तरीका है लेकिन यदि आप एक बार और उसी सत्र में परिभाषित चर के लिए ऐसा करना चाहते हैं तो नहीं।
terdon

7

-मेरे लिए काम करता है। आदमी से sudo-

-E, सुरक्षा नीति को इंगित करता है कि उपयोगकर्ता अपने मौजूदा पर्यावरण चर की सेवा करना चाहता है। यदि उपयोगकर्ता के पास पर्यावरण को संरक्षित करने के लिए अनुमति नहीं है, तो सुरक्षा नीति में कोई त्रुटि हो सकती है।--preserve-env


दुर्भाग्य से यह केवल तभी काम करेगा जब आपका व्यवस्थापक आपको उपयोग करने से प्रतिबंधित न करे।
टॉरस्टांस

0

निम्नानुसार एक समाधान है जिसे सुरक्षा नीति को बदलने के लिए किसी की आवश्यकता नहीं है।

मैं suभाग को नजरअंदाज कर दूंगा , क्योंकि हम इसके --userविकल्प का उपयोग कर सकते हैं sudo

हम पर्यावरण चर को एक commandरन के माध्यम से पारित करना चाहते हैं sudo। हालांकि sudoपर्यावरण चर को एक आदेश में पारित करने की अनुमति नहीं दी जाएगी (इसके लिए वैध सुरक्षा कारण हैं, कुछ चर खतरनाक हो सकते हैं)। एक शेल का उपयोग पर्यावरण चर को सेट करने के लिए किया जा सकता है, और sudoएक शेल को उस पर पारित स्क्रिप्ट के साथ चलाया जा सकता है। इसलिए sudoपर्यावरण चर सेट करने वाली स्क्रिप्ट चलाने के लिए कहें ।

var_a=someThing
var_b=someOtherThing

sudo bash -c "
    export var_a=\"${var_a}\"
    export var_b=\"${var_b}\"

    the_command some_args
"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.