सुदो सु खोल बदलो


13

जब भी मैं sudo suअपने सामान्य zsh(जो ओह-माय-ज़श फ्रेमवर्क का उपयोग करता है ) से चलाता हूं, तो मुझे shडिफ़ॉल्ट रूप से पुराने बॉर्न शेल ( ) का उपयोग करने के लिए मजबूर किया जाता है (जाहिर है, यह अधिकांश * निक्स-जैसी प्रणालियों पर मानक व्यवहार है)। यदि मैं दौड़ने zshके shबाद भीतर से दौड़ता sudo suहूं, तो मुझे Z खोल मिलता है, लेकिन ओह-माय-जेडश से सुधार के बिना।

क्या शेल sudo suलॉन्च को बदलने का कोई तरीका है zsh? यदि हां, तो क्या यह भी संभव है कि zshलॉन्च का उपयोग करने का उदाहरण है oh-my-zsh?

मैं OS X 10.8.4 का उपयोग कर रहा हूं।

जवाबों:


21

सुपरयूज़र के रूप में एक इंटरैक्टिव शेल को निष्पादित करने का दूसरा तरीका है sudo -s, जो $SHELLशेल के रूप में उपयोग करता है ।

जैसा कि उल्लेखित अन्य उत्तर में टिप्पणी है, su -s /path/to/zshओएस एक्स में काम नहीं करता है।

ओएस एक्स /etc/passwdया तो लॉगिन गोले बदलने का समर्थन नहीं करता है , लेकिन आप इसका उपयोग कर सकते हैं dscl:

$ dscl . -read /Users/root UserShell
/bin/sh
$ sudo dscl . -change /Users/root UserShell /bin/sh /bin/zsh
$ dscl . -read /Users/root UserShell
/bin/zsh
$ sudo su
My-iMac# echo $0
zsh
My-iMac# exit
$ sudo dscl . -change /Users/root UserShell /bin/zsh /bin/sh
$ 

/bin/shअब अधिकांश प्लेटफार्मों पर बॉर्न शेल नहीं है। यह OS X में bash और डैश डैश में POSIX-compliant संस्करण है


यह वही है जो मुझे लगता है कि प्रश्न चाहता था। यह निश्चित रूप से मेरे लिए काम कर रहा है; आपको बहुत - बहुत धन्यवाद! संपादित करें मैं देखें कि वह अब क्या चाहता था - मुझे नहीं लगता कि यह वही है जो वह चाहता था, इसलिए मैं इसे इस सवाल के लिए काफी नहीं कर सकता, लेकिन मुझे लगता है कि आप वैसे भी पदक के लायक हैं। मेरे सवाल का जवाब आपके पास था !
व्याट8740

4

से suमैनपेज, आप दो तरीकों से ऐसा कर सकते हैं कर रहे हैं।


पहली विधि बस -sया --shellध्वज का उपयोग करना है (यह मानते हुए कि आप suइस तर्क का समर्थन करने वाले संस्करण के साथ * एनआईएक्स-आधारित ओएस का उपयोग कर रहे हैं ), इसके बाद अपनी पसंद के खोल तक का रास्ता। यदि उत्तीर्ण शेल नहीं मिल सकता है, suतो निम्न विधि का विरोध करता है, और असफल होने पर, आह्वान करने का प्रयास करेगा /bin/sh

उदाहरण के लिए, आप suलॉन्च करने के लिए बाध्य कर सकते हैं zsh(यह मानते हुए कि इसमें मौजूद है /bin/zsh):

sudo su --shell /bin/zsh

दूसरी विधि rootउपयोगकर्ता के लिए निर्दिष्ट डिफ़ॉल्ट शेल को संशोधित करना है ( सावधान रहें! )। यह फ़ाइल को संपादित करके /etc/passwdऔर rootउपयोगकर्ता के लिए निर्दिष्ट शेल को बदलकर किया जा सकता है । यह देखने के लिए कि शेल डिफ़ॉल्ट रूप से निर्दिष्ट है, आप निम्न कमांड चला सकते हैं (सुपरसुअर रूट है)

sudo grep root /etc/passwd 

कमांड को कुछ इस तरह आउटपुट करना चाहिए root:x:0:0:root:/root:/bin/bash। इसके बजाय /bin/bashइंगित करने के लिए आप बस (या आपके सिस्टम में जो कुछ भी सेट किया गया है) को बदल सकते हैं zsh


3
हमेशा की तरह, रूट के शेल को बदलने के बारे में सावधान रहें। आप एकल उपयोगकर्ता मोड में नहीं होना चाहते हैं, और एक रूट शेल है जिसकी आवश्यकता / usr जब यह टूट जाता है। पट्टे पर सुनिश्चित करें कि आपके नए शेल में आपके द्वारा प्रतिस्थापित किए जा रहे फ़ाइल से अधिक निर्भरता नहीं है
रिच होमोलका

रनिंग sudo su -s /bin/zsh(या उपयोग --shell) रिटर्न su: illegal option -- s। मैं ओएस एक्स 10.8.4 पर हूं; क्या OS X एक अलग कमांड लेता है?
जूल्स

@JulesMazur का आउटपुट क्या है cat /etc/shells? तकनीकी रूप से केवल उस फ़ाइल में दिए गए गोले लॉन्च किए जाएंगे, हालांकि suमैनपेज कहता है कि इस बात से कोई फर्क नहीं पड़ता कि suइसे रूट कहा जाए: S
ब्रेकथ्रू

cat /etc/shells/bin/zshएक स्वीकार्य खोल के रूप में देता है ।
जूल्स

2
@JulesMazur कृपया इस तरह के भ्रम से बचने के लिए अपने ओएस को हमेशा शामिल करें।
टेराडॉन

1

एक क्लीनर तरीका जो आपके कस्टम शेल को उड़ा देने की स्थिति में भी आपके सिस्टम की रक्षा करेगा, रूट के होम पेज w में एक .profile बनाने के लिए है:

if [ -x /opt/local/bin/bash ]; then
    SHELL=/opt/local/bin/bash
    export SHELL
    exec /opt/local/bin/bash
else
    echo /opt/local/bin/bash not found using default shell of $SHELL
fi

बस बैश के बजाय अपने इच्छित शेल के लिए पथ बदलें।


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