रूट एक्सेस के बिना zsh डिफ़ॉल्ट शेल बनाना


52

मैं अपने स्कूल के कंप्यूटरों का उपयोग कर रहा हूं और zshइसके बजाय उपयोग करना चाहूंगा bash। मैं इसे डिफ़ॉल्ट शेल बनाना चाहता हूं, लेकिन मैं एक कमांड नहीं चला सकता, $ chsh -s $(which zsh)क्योंकि मेरे पास व्यवस्थापक विशेषाधिकार नहीं हैं।

क्या कोई ऐसा तरीका है जो मैं अपने .bashrcया कुछ में डाल सकता हूं जो स्वचालित रूप से कॉल करता है zshजब यह वर्कअराउंड के रूप में खुलता है?

स्पष्ट करने के लिए, zshपहले से ही स्थापित है।


2
हाँ, बस फ़ाइल zshपर जोड़ें .bashrc। लॉगआउट और लॉगिन और किया!
फेडोरक्वि

उसके लिए माफ़ करना। लेकिन सवाल खत्म करने के लिए, मैं सिर्फ zshपहली पंक्ति में हूं ?

3
Zb में .bashrc रखने से यह bashस्पष्ट रूप से कहे जाने पर भी हमेशा निष्पादित होता है। .bash_profileइसके बजाय इसे बेहतर जगह दें ।
konsolebox

आप टर्मिनल प्राथमिकताओं में अपने डिफ़ॉल्ट शेल के रूप में zsh सेट कर सकते हैं (एक नया प्रोफ़ाइल बनाएं)।
लामाओउ डे

जवाबों:


68

.bash_profileअपने घर निर्देशिका में बनाएँ और इन पंक्तियों को जोड़ें:

export SHELL=/bin/zsh
exec /bin/zsh -l

अद्यतन: .profileडिफ़ॉल्ट शेल न होने पर सामान्य समाधान के रूप में काम कर सकता है। मुझे यकीन नहीं है कि अगर .profileज़ीश द्वारा भी बुलाया जा सकता है तो यह बेमानी हो सकता है लेकिन हम इसे एक साधारण जांच के साथ सुरक्षित रूप से कर सकते हैं:

export SHELL=/bin/zsh
[ -z "$ZSH_VERSION" ] && exec /bin/zsh -l

हम whichगतिशील पथ को प्राप्त करने के लिए भी उपयोग कर सकते हैं , zshजिसका मूल्य इस पर निर्भर करता है $PATH:

export SHELL=`which zsh`
[ -z "$ZSH_VERSION" ] && exec "$SHELL" -l

क्या होगा यदि लिनक्स एडमिन (रूट) आपके डिफ़ॉल्ट शेल को बैश (लेकिन zsh नहीं) के अलावा किसी और चीज़ में बदलता है, उदाहरण के लिए ksh? तो .bash_profileसंदर्भित नहीं मिलेगा। .profileइसके बजाय इसे कैसे रखा जाए ?
जोशुआ ह्यूबर

@JoshuaHuber अंतिम परीक्षण मैंने किया, .profileकाम नहीं किया। द्वारा भी नहीं .profileबुलाया जाएगा Zsh? यह बेमानी हो सकता है। हालांकि अभी तक इसकी जाँच नहीं की गई है। (अपडेट: यह अब काम कर रहा था, सुनिश्चित नहीं कि मैंने पहले कौन सी गलती की थी।) उपयोग करने के साथ संभावित कमियों के बारे में कोई विचार .profile?
konsolebox

1
@konsolebox बैश एकमात्र स्रोत .profileहै, तो .bash_profileमौजूद नहीं है (जब तक आप स्वयं से यह स्रोत .bash_profile, निश्चित रूप से)। विशेष रूप से, पार्टी सूत्रों का कहना है फ़ाइलों की पहली एक [ .bash_profile> .bash_login> .profile] यह पाता है। यह केवल .profilePOSIX (बॉर्न शेल) संगतता सुविधा के रूप में दिखता है ।
पायरोक्रास्टी

@pyrocrasty वास्तव में। जैसा कि नियमावली में कहा गया है: "उस फ़ाइल को पढ़ने के बाद, यह उस क्रम में ~ / .bash_profile, ~.bash_login और ~ / .profile की तलाश करता है, और पहले से मौजूद आदेशों को पढ़ता और निष्पादित करता है और पढ़ने योग्य होता है। । "
konsolebox

इसके साथ एक नए टर्मिनल प्रोफ़ाइल सेट करने के लिए काम किया है के बजाय मेरी खोल भागो कस्टम आदेश के लिए बदल दिया zsh.bash_profileऔर .profileकाम नहीं किया (फ़ाइलों को भी निष्पादित नहीं किया गया था, फेडोरा 26 एक विश्वविद्यालय के कंप्यूटर पर)।
लामाओऊ

12

आम तौर पर आप chshएक गैर-रूट उपयोगकर्ता के रूप में उपयोग कर सकते हैं । लेकिन यह कभी-कभी अक्षम होता है, आमतौर पर उन साइटों में जो एनआईएस और एलडीएपी जैसे नेटवर्क उपयोगकर्ता डेटाबेस के कुछ रूप का उपयोग करते हैं। इसके बजाय एक ypchsh(NIS) या chsh.ldap(LDAP) हो सकता है।

chshआम तौर पर केवल कुछ अनुमोदित गोले की अनुमति देगा , जो आमतौर पर सूचीबद्ध हैं /etc/shells

यदि आप chshअपनी साइट पर इसके वेरिएंट का उपयोग या उपयोग नहीं कर सकते हैं , तो अपने लॉगिन शेल को execअपने पसंदीदा शेल में व्यवस्थित करें और अपने पसंदीदा शेल SHELLको इंगित करने के लिए चर सेट करें ।

  • यदि आपका लॉगिन शेल है sh, dashया ksh: आपके द्वारा संपादित की जाने वाली फ़ाइल है ~/.profile। सावधान रहें कि यह फ़ाइल इंटरएक्टिव सत्र की शुरुआत के साथ-साथ कुछ गैर-संवादात्मक सत्र स्टार्टअप स्क्रिप्ट (उदाहरण के लिए X11 सत्र) द्वारा पढ़ा जाता है, इसलिए आपको ध्यान रखने की आवश्यकता है: केवल कॉल exec(जो वर्तमान प्रक्रिया को बदलता है) जब वर्तमान खोल इंटरैक्टिव है। बॉर्न शेल ( /bin/shसोलारिस 10 और उससे पहले के) को छोड़कर , आप बता सकते हैं कि iविकल्प सूची ( $-) में मौजूद है।

    preferred_shell=
    if [ -x /bin/zsh ]; then
      preferred_shell=/bin/zsh
    fi
    
    if [ -n "$preferred_shell" ]; then
      case $- in
        *i*) SHELL=$preferred_shell; export SHELL; exec "$preferred_shell";;
      esac
    fi

    यदि आप अपने पढ़ने के लिए zsh चाहते हैं .zprofile, तो -lविकल्प पास करें ।

  • यदि आपका लॉगिन शेल है bash, तो आप ऊपर के रूप में आगे बढ़ सकते हैं। वैकल्पिक रूप से, आप इन आदेशों को अंदर रख सकते हैं ~/.bash_profile। अधिकांश सत्र स्टार्टअप स्क्रिप्ट केवल पढ़ते हैं ~/.profileऔर नहीं ~/.bash_profile, लेकिन मैंने कुछ ऐसे देखे हैं जो बैश के तहत चलते हैं और पढ़े जाते हैं .bash_profile, इसलिए वहां भी आपको सावधान रहना चाहिए कि execगैर-इंटरैक्टिव शेल में कॉल न करें ।

  • यदि आपका लॉगिन शेल csh या tsh है, तो chsh या एडमिनिस्ट्रेटर के निजीकरण के बिना डिफ़ॉल्ट शेल को बदलने में एक उदाहरण देखें


1

मेरा मानना ​​है कि आज्ञा, chshइसी उद्देश्य के लिए है। हालाँकि, मुझे यकीन नहीं है कि हर लिनक्स / यूनिक्स डिस्ट्रो सपोर्ट करता है। का मैन पेज चेक करें chsh


कुछ प्रणालियों के रूप में भी है passwd -s
स्टीफन चेज़लस

1

यदि आप नहीं चला सकते हैं chshक्योंकि आपके पास व्यवस्थापक विशेषाधिकार नहीं हैं, तो किसी ऐसे व्यक्ति से बात करें जो करता है

सबसे अधिक संभावना है कि आप chshगैर-रूट के रूप में उपयोग नहीं कर सकते क्योंकि आप जिस सिस्टम का उपयोग कर रहे हैं वह कॉन्फ़िगर किया गया है इसलिए chshकाम नहीं करेगा, क्योंकि सिस्टम केवल /etc/passwdफ़ाइल के बजाय एनआईएस या एलडीएपी का उपयोग करता है । या शायद आपके सिस्टम का व्यवस्थापक कुछ नियंत्रण बनाए रखना चाहता है।

आपके शेल को बदलने की प्रक्रिया आपके संगठन की नीतियों पर निर्भर करती है। एक स्थानीय कमांड हो सकता है जो chshसामान्य रूप से करता है। या आपको शेल परिवर्तन का अनुरोध करते हुए एक समर्थन टिकट जमा करने की आवश्यकता हो सकती है।

अधिकांश अन्य उत्तर अच्छे हैं, लेकिन यदि आपके व्यवस्थापक यथोचित रूप से उत्तरदायी हैं, तो आप अपने स्टार्टअप स्क्रिप्ट को हैक करने से परेशान नहीं होना चाहते। मैं शायद केवल zsh -lलॉग इन करने के बाद मैन्युअल रूप से आह्वान करूंगा जब तक कि व्यवस्थापक मेरे खाते को अपडेट करने के लिए चारों ओर न पहुंच जाए।

एक और बात ध्यान में रखें: कभी-कभी विभिन्न गोले एक ही स्टार्टअप फ़ाइलों का उपयोग कर सकते हैं। उदाहरण के लिए, shऔर bashदोनों निष्पादित कर सकते हैं $HOME/.profile, और cshऔर tcshदोनों निष्पादित कर सकते हैं $HOME/.loginऔर $HOME/.cshrc(हालांकि जैसा शेल-विशिष्ट स्टार्टअप फ़ाइलों .bashrc, .bash_profileऔर .tcshrcउन ओवरराइड कर सकते हैं)। यदि आपका डिफ़ॉल्ट शेल है /bin/cshऔर आप उपयोग करना चाहते हैं /bin/tcsh, तो अपने .loginइनवॉइस को अपडेट करने से /bin/tcsh -lएक अनंत लूप बन सकता है। -स्पेशल स्टार्टअप फ़ाइलों zshको निष्पादित करने के लिए नहीं होता है bash, इसलिए यह आपके लिए कोई समस्या नहीं है।

अधिकांश गोले चर की पहचान जो शैल आप (चला रहे हैं सेट $BASH_VERSION, $tcsh, $ZSH_VERSION)। यदि आप अपने पसंदीदा शेल को इनवॉइस करने के लिए स्टार्टअप कोड लिखने जा रहे हैं, तो यह एक बुरा विचार नहीं है, ifताकि आप इसे पहले से ही उस शेल में न चलाएं। Konsolebox के उत्तर से कोड का उपयोग करना :

if [ "${ZSH_VERSION:-unset}" = "unset" ] ; then
    export SHELL=/bin/zsh
    exec /bin/zsh -l
fi

( आपके द्वारा की गई संभावना के "${ZSH_VERSION:-unset}"बजाय जाँच की अतिरिक्त जटिलता , एक विकल्प है जो एक त्रुटि के लिए अपरिभाषित चर के संदर्भ का कारण बनता है।)"$ZSH_VERSION"set -o unset


1

मैं कुछ परिदृश्यों के बारे में सोच सकता हूं।

  1. zshमें नहीं है /etc/shells, और ओ पी लिखे बिना इसका इस्तेमाल करना चाहती है zshकमांड प्रॉम्प्ट पर। संभव समाधान।

    a) लॉगिन पर इसे निष्पादित करने के लिए प्रोफ़ाइल ट्रिक्स का उपयोग करें। यह सिर्फ उतना ही प्रभावी है जितना वास्तव में शेल को बदलना।

    ख) आप इसे कर सकते हैं zshकरने के लिए जोड़ने के लिए व्यवस्थापक से भीख माँगती हूँ/etc/shellschsh

    c) अपने शेल को बदलने के लिए एडमिन से विनती करें। यह बुद्धिमान नहीं है, क्योंकि यह आपको अंदर की क्षमता खो देगा ftp। आप केवल तभी उपयोग कर सकते हैं ftpजब आपके पास एक शेल हो/etc/shells

  2. उपयोगकर्ता एक प्रतिबंधित शेल से बचना चाहता है, सबसे अधिक संभावना है rbashया rsh

    यदि .profileसंपादन योग्य है, तो PATHइसे संपादित करके विस्तार किया जा सकता है। एक बार /binरास्ते में आने के बाद, आप bashअंदर से शुरू rsh/rbashकर सकते हैं, chshकमांड तक पहुंच प्राप्त करके आपको गोले बदलने की सुविधा दे सकते हैं। कई आदेशों में शेल एस्केप हैं जिनका उपयोग एक प्रतिबंधित शेल से बचने और एक्सेस हासिल करने के लिए किया जा सकता है chsh

  3. chshवास्तव में किसी और कारण से काम नहीं करता है। संभावना 1 से समाधान यहाँ भी एक उत्तर है।

परिदृश्य 2 वास्तव में डिफ़ॉल्ट शेल को बदलने का एकमात्र कारण है (यह बहुत प्रतिबंधक है)।


-3

मुझे नहीं लगता कि प्रदान किया गया उत्तर वास्तव zshमें डिफ़ॉल्ट शेल बनाता है। जैसे ही उपयोगकर्ता अपने डिफ़ॉल्ट शेल में लॉग करता है, यह शेल को zsh में बदल देता है । उपयोगकर्ता अभी भी इसके लिए लॉगिन करेगा DEFAULT SHELLलेकिन इसके साथ, शेल में बदल जाएगाzsh

डिफ़ॉल्ट शेल उपयोग बदलने के लिए:

usermod -s /path/to/shell username 

आपको ऐसा करने के लिए रूट होना चाहिए।

अन्यथा उपरोक्त वर्कअराउंड काम आएगा।

टिप्पणी से जोड़ा गया

chsh -s /path/to/zsh  # considered as standard as compared to usermod

और यह उसके द्वारा / अपने लिए उपयोगकर्ता द्वारा मंगवाया जा सकता है।


4
यह सवाल बहुत स्पष्ट रूप से बताता है कि सिस्टम उपयोगकर्ता डेटाबेस को संशोधित करना (इस उत्तर में करने के लिए आपको जिस रूट की आवश्यकता है) एक विकल्प नहीं है।
कालेब

3
chsh -s /path/to/zshअधिक मानक है और आमतौर पर (लेकिन हमेशा नहीं) रूट एक्सेस की आवश्यकता नहीं होती है, usermodजिसके विपरीत हमेशा करता है। तो आपके उत्तर में समस्याओं की तुलना में अधिक समस्याएं हैं जो पहले से ही काम नहीं करने के रूप में बताती हैं।
गाइल्स का SO- बुराई पर रोक '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.