जवाबों:
आप इसे बिना लॉगिन शेल के कॉल कर सकते हैं:
sudo DUMMY=dummy su ec2-user -c 'echo "$DUMMY"'
या:
sudo DUMMY=dummy su -p - ec2-user -c 'echo "$DUMMY"'
कमांड का -p
विकल्प su
पर्यावरण चर को संरक्षित करता है।
-p
विकल्प su
नहीं sudo
है
-m
हैं कि चर को संरक्षित करता है, अन्य कहते हैं -c
कि अंतर क्या है? और इस उत्तर दिनों में एक टिप्पणी -E
stackoverflow.com/questions/10488758/…
प्रो टिप: वास्तव में चलाने का एक अच्छा कारण कभी नहीं है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
env_keep
में sudoers
। शायद इस तरह Defaults env_keep += "DUMMY"
:।
sudo
। यह एकल चर के लिए अधिक बोझिल भी है। यह केवल उस चीज के लिए उपयोगी है जिसे हमेशा निर्यात किया जाना चाहिए।
LD_PRELOAD
और ले जाने के बीच एक पर्याप्त अंतर है LESSCHARDEF
। मुझे नहीं लगता कि सुविधा को जीतने वाला तर्क होना चाहिए ...
-मेरे लिए काम करता है। आदमी से sudo
-
-E
, सुरक्षा नीति को इंगित करता है कि उपयोगकर्ता अपने मौजूदा पर्यावरण चर की सेवा करना चाहता है। यदि उपयोगकर्ता के पास पर्यावरण को संरक्षित करने के लिए अनुमति नहीं है, तो सुरक्षा नीति में कोई त्रुटि हो सकती है।--preserve-env
निम्नानुसार एक समाधान है जिसे सुरक्षा नीति को बदलने के लिए किसी की आवश्यकता नहीं है।
मैं 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
"
sudo -iu ec2-user echo $DUMMY
?