मैं अपने लॉगिन शेल के रूप में bash का उपयोग कैसे कर सकता हूं जब मेरा sysadmin मुझे इसे बदलने से मना कर देता है


38

यूनिक्स सिसडमिन जहां मैं काम कर रहा हूं, मुझे अपने लॉगिन शेल को से बदलने के लिए एक्सेस देने के लिए अनिच्छुक kshहै bash। उन्होंने विभिन्न बहाने दिए हैं, सबसे मजेदार यह है कि जब से kshमैं उन्हें चलाने की कोशिश करता हूं, तो वे अपनी सभी पटकथाएं लिखते हैं। मुझे नहीं पता कि उसे ये विचार कहां से मिले, लेकिन चूंकि मैं उसे मना नहीं सकता, तो क्या मेरे पास कोई विकल्प है?

( chshइन मशीनों पर इंस्टॉल किया गया है, लेकिन हम लॉग इन करने के लिए सार्वजनिक / निजी कीपेयर का उपयोग करते हैं, और मेरे पास कोई पासवर्ड नहीं है, इसलिए जब chshमुझे पासवर्ड के लिए संकेत देता है तो मेरे पास इसे देने के लिए कुछ भी नहीं है।)

जवाबों:


69

जब आप लॉग इन करते हैं, तो फ़ाइल ~/.profileलॉगिन शेल (आपके लिए ksh) द्वारा पढ़ी जाती है। आप उस लॉगिन शेल को बैश करके खुद को बदलने का निर्देश दे सकते हैं। आपको कुछ सावधानियां बरतनी चाहिए:

  • इंटरेक्टिव होने पर ही लॉगिन शेल को बदलें। यह महत्वपूर्ण है: अन्यथा, ग्राफिक मोड में लॉगिंग काम नहीं कर सकती है (यह सिस्टम-निर्भर है: कुछ लेकिन सभी सिस्टम नहीं पढ़ते हैं ~/.profileजब xdm या समान के माध्यम से लॉग इन करते हैं), और मुहावरे जैसे कि ssh foo '. ~/.profile; mycommand'विफल हो जाएंगे।
  • जाँच करें कि बैश उपलब्ध है, ताकि आप अभी भी लॉग इन कर सकें यदि निष्पादन योग्य किसी कारण से नहीं है।

आपके पास एक विकल्प है कि बैश को लॉगिन शेल के रूप में चलाएं या नहीं। इसे लॉगिन शेल बनाने में एकमात्र बड़ा अंतर यह है कि यह लोड होगा ~/.bash_profileया ~/.profile। तो अगर आप लॉगिन शेल के रूप में बैश चलाते हैं, तो बहुत सावधानी बरतें ~/.bash_profileया इस बात का ध्यान रखें कि बैर को फिर से न चलाएं ~/.profile~/.profileKsh के बजाय bash द्वारा निष्पादित होने का कोई वास्तविक लाभ नहीं है, इसलिए मैं इसे नहीं करने की सलाह दूंगा।

SHELLपर्यावरण चर को भी काटने के लिए सेट करें , ताकि टर्मिनल एमुलेटर जैसे कार्यक्रम उस शेल को लागू करेंगे।

यहां बैश पर स्विच करने के लिए कोड है। के अंत में रखें ~/.profile

case $- in
  *i*)
    # Interactive session. Try switching to bash.
    if [ -z "$BASH" ]; then # do nothing if running under bash already
      bash=$(command -v bash)
      if [ -x "$bash" ]; then
        export SHELL="$bash"
        exec "$bash"
      fi
    fi
esac

17
बहुत बढ़िया जवाब! स्टैकएक्सचेंज को सेंड ए बीयर बटन चाहिए: यह एक समय होगा जब मैं इसका उपयोग करूंगा।
iconoclast

पहले धन्यवाद और। .profileकेवल लॉगिन शेल (ओपी जरूरत के अनुसार) के लिए काम करता है। मैं लिनक्स वर्कस्टेशन में प्रवेश करने के लिए विंडोज 10 के रिमोट डेस्कटॉप कनेक्शन का उपयोग करता हूं, फिर गनोम में टर्मिनल खोलें। मैं चाहता हूँ, zshजबकि मेरे sysadmin मुझे दे bash। इस मामले में, मुझे .bashrcइसके बजाय स्निपेट जोड़ना होगा .profile
वीकेंड

12

यह थोड़ा क्लीज है, लेकिन आप अपने होम डायरेक्टरी में bashएक .profileफाइल बनाकर लॉगिन का उपयोग कर सकते हैं , जिसमें आप लॉगिन का उपयोग कर रहे हैं

SHELL=`type -P bash`
exec bash -l

यह kshसत्र को सत्र के साथ प्रतिस्थापित करने का कारण बनेगा bash। आपको दो बार टाइप exit(या ^D) नहीं करना होगा , जैसा कि यदि आप मैन्युअल रूप से bashलॉग इन और टाइपिंग में हर बार एक नया सत्र शुरू करते हैं

echo $SHELL

यहां तक ​​कि रास्ता भी लौटाएगा bash


3
आप निश्चित रूप से निष्पादन से पहले ऐसा करने के लिए एक पंक्ति जोड़कर $ SHELL को आसानी से बदल सकते हैं।
derobert

2
यदि आप चाहते हैं कि नया शेल भी एक लॉगिन शेल हो, तो आपको संभवतः होना चाहिए exec bash -l
jw013

1
एक अंतिम टिप्पणी: typeपर सिफारिश की है which
jw013

1
मुझे नहीं मिला! नहीं होगा bashभी पढ़ .profileअनंत लूप पैदा इस प्रकार? मैं इस बात से सहमत हूं कि exec bashआप जो चाहते हैं, उसकी तर्ज पर कुछ है, लेकिन आपको यह सुनिश्चित करने की आवश्यकता है कि आप इसे केवल अपने लॉगिन ksh में ही करें, यदि कुछ स्टेटमेंट्स की आवश्यकता है!
बनगुंगिन

1
@ user1129682 अगर वहाँ नहीं है ~/.bash_profileया~/.bash_login
Ulrich Dangel

4

बैश को अंजाम देते समय गिल्स के जवाब में -l फ्लैग जोड़ा जाना चाहिए, ताकि नए लॉग शीश में किसी भी लॉगिन प्रोफाइल स्क्रिप्ट को सॉर्ट किया जा सके। (उदाहरण के लिए / RHEL पर /etc/profile.d/ में कुछ भी)। स्क्रिप्ट तब होनी चाहिए:

case $- in
  *i*)
    # Interactive session. Try switching to bash.
    if [ -z "$BASH" ]; then # do nothing if running under bash already
      bash=$(command -v bash)
      if [ -x "$bash" ]; then
        export SHELL="$bash"
        exec "$bash" -l
      fi
    fi
esac

क्या आप बता सकते हैं कि आप -lविकल्प जोड़ने के लिए क्यों कहते हैं ? मैं इसे बिना किसी समस्या के महीनों के लिए उपयोग कर रहा हूं।
22

1

csh/tcsh@Gilles द्वारा शीर्ष मतदान से प्रेरित के लिए एक उत्तर है

if ( ! $?BASH ) then
  setenv BASH `command -v bash`
endif

if ( $?prompt ) then
  if ( -x "$BASH" ) then
    exec "$BASH"
  endif
endif

0

सोलारिस:

usermod -s /bin/bash root

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