अपने पर्यावरण के साथ एक और उपयोगकर्ता के रूप में sudo


56

$ whoami
admin
$ sudo -S -u otheruser whoami
otheruser
$ sudo -S -u otheruser /bin/bash -l -c 'echo $HOME'
/home/admin

बैश को एक लॉगिन शेल के रूप में लागू करने के बावजूद $HOMEसेट क्यों नहीं किया जा रहा है /home/otheruser?

विशेष रूप से, /home/otheruser/.bashrcइसे खट्टा नहीं किया जा रहा है। इसके अलावा, /home/otheruser/.profileइसे खट्टा नहीं किया जा रहा है। - ( /home/otheruser/.bash_profileमौजूद नहीं है)

संपादित करें: सटीक समस्या वास्तव में https://stackoverflow.com/questions/27738224/mkvirtualenv-with-fabric-as-another-user-fails है


इस प्रश्न का समाधान अन्य प्रश्न भी हल करेगा, आप इस स्थिति में अन्य प्रश्न को हटाना चाह सकते हैं।
पावेल Paमेरदा

जवाबों:


83

sudoबस उपयोग के लिए एक लॉगिन शेल आह्वान करने के लिए -i। जब कमांड निर्दिष्ट नहीं किया जाता है, तो आपको लॉगिन शेल प्रॉम्प्ट मिलेगा, अन्यथा आपको अपने कमांड का आउटपुट मिलेगा।

उदाहरण (लॉगिन शेल):

sudo -i

उदाहरण (एक निर्दिष्ट उपयोगकर्ता के साथ):

sudo -i -u user

उदाहरण (एक आदेश के साथ):

sudo -i -u user whoami

उदाहरण (उपयोगकर्ता प्रिंट करें $HOME):

sudo -i -u user echo \$HOME

नोट: बैकस्लैश चरित्र यह सुनिश्चित करता है कि डॉलर का चिन्ह लक्ष्य उपयोगकर्ता के शेल तक पहुंच जाए और कॉलिंग उपयोगकर्ता के शेल में व्याख्या न की जाए।

मैंने स्ट्रेस के साथ अंतिम उदाहरण की जाँच की है जो आपको बताता है कि वास्तव में क्या हो रहा है। आउटपुट बोले से पता चलता है कि शेल को --loginनिर्दिष्ट कमांड के साथ और उसके साथ बुलाया जा रहा है , जैसे कि आपके स्पष्ट कॉल को कोसने के लिए, लेकिन इसके अलावा sudo अपना काम भी कर सकता है जैसे सेटिंग करना $HOME

# strace -f -e process sudo -S -i -u user echo \$HOME
execve("/usr/bin/sudo", ["sudo", "-S", "-i", "-u", "user", "echo", "$HOME"], [/* 42 vars */]) = 0
...
[pid 12270] execve("/bin/bash", ["-bash", "--login", "-c", "echo \\$HOME"], [/* 16 vars */]) = 0
...

मैंने देखा कि आप उपयोग कर रहे हैं -Sऔर मुझे नहीं लगता कि यह आमतौर पर एक अच्छी तकनीक है। यदि आप कीबोर्ड से प्रमाणीकरण किए बिना एक अलग उपयोगकर्ता के रूप में कमांड चलाना चाहते हैं, तो आप इसके बजाय SSH का उपयोग करना चाह सकते हैं। यह localhostअन्य मेजबानों के लिए भी काम करता है और सार्वजनिक कुंजी प्रमाणीकरण प्रदान करता है जो बिना किसी इंटरेक्टिव इनपुट के काम करता है।

ssh user@localhost echo \$HOME

नोट: आपको SSH के साथ किसी विशेष विकल्प की आवश्यकता नहीं है क्योंकि SSH सर्वर हमेशा SSH क्लाइंट द्वारा एक्सेस किए जाने के लिए एक लॉगिन शेल बनाता है।


2
sudo -i -u user echo \$HOMEमेरे लिए काम नहीं करता है। आउटपुट: $HOME। स्ट्रेस आपके जैसा ही आउटपुट देता है। मुद्दा क्या है?
जॉन_वेस्ट

कोई विचार नहीं, यह अभी भी मेरे लिए काम करता है, मुझे इसे देखने की आवश्यकता है या शायद सिस्टम को भी छू सकता है।
पावेल Paमेरदा

10

आप बैश को बहुत अधिक श्रेय दे रहे हैं। बैश करने के लिए सभी "लॉगिन शेल" का मतलब है कि स्टार्टअप और शटडाउन में कौन सी फाइलें हैं। $HOMEचर इसे में जिक्र नहीं है।

बैश डॉक्स कुछ और समझाते हैं कि लॉगिन शेल का क्या अर्थ है: https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html#Bash-Startup-Files

वास्तव में, बैश बिल्कुल कुछ भी सेट नहीं करता है $HOME$HOMEशेल (लॉगिन, ssh, इत्यादि) को जो भी आमंत्रित करता है, उसके द्वारा सेट किया जाता है और शेल को यह विरासत में मिलता है। जो कुछ भी व्यवस्थापक सेट के रूप में अपने खोल शुरू कर दिया $HOMEऔर उसके बाद कार्यकारी एड bash, sudoपर्यावरण में परिवर्तन नहीं करता जब तक पूछा या, ऐसा करने के लिए कॉन्फ़िगर किया गया तो डिजाइन द्वारा bashके रूप में otheruser अपने खोल से विरासत में मिला।

यदि आप sudoजिस तरह की अपेक्षा कर रहे हैं, उसमें पर्यावरण का अधिक से अधिक संचालन करना चाहते हैं, तो -isudo के स्विच को देखें। प्रयत्न, कोशिश:

sudo -S -u otheruser -i /bin/bash -l -c 'echo $HOME'

सुडो के लिए मैन पेज इसे और अधिक विस्तार से वर्णन करता है, हालांकि वास्तव में अच्छी तरह से नहीं है, मुझे लगता है: http://linux.die.net/man/3/udo


4
$ HOME को bash द्वारा सेट नहीं किया गया है - धन्यवाद, मुझे यह नहीं पता था।
user80551

के लिए देखो strace मेरा उत्तर में। यह दिखाता है कि /bin/bash -l -c 'echo $HOME'उपयोग करते समय आपको स्वयं कमांड लाइन बनाने की आवश्यकता नहीं है -i
पावेल Paमेरदा

1
उस sudoसिंटैक्स ने मेरी मशीन पर एक त्रुटि डाली। ( suका उपयोग करता है -cविकल्प है, लेकिन मुझे नहीं लगता कि sudoकरता है।) मैं के साथ बेहतर किस्मत थी:HomeDir=$( sudo -u "$1" -H -s echo "\$HOME" )
palswim

हाँ, @palswim सही है। के बारे में निश्चित नहीं है -S(मुझे इसकी आवश्यकता नहीं थी, इसलिए मैंने इसे छोड़ दिया), लेकिन -cयहां काम नहीं करता है, आपको -sइसके बजाय की आवश्यकता है ।
बहुपत्नी_दौत
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.