TL; DR :
- लॉगिन शेल को कहाँ परिभाषित किया गया है? में
/etc/passwd।
- कर रहे हैं
sudo su/ sudo su -/ sudo -i/ sudo -sएक ही? नहीं, वे सभी एक खोल को अलग-अलग और अलग-अलग संदर्भों में देखते हैं।
- क्या करता
$SHELLहै? बस अपने डिफ़ॉल्ट शेल को बताएं, जैसे ही में /etc/passwd।
वास्तविक उत्तर :
सबसे पहले, यह उल्लेख करना महत्वपूर्ण है कि shoptबैश-विशिष्ट है। उदाहरण के लिए, मैं mkshशेल उपयोगकर्ता हूं , और ऐसा नहीं है shopt, जैसे kshनहीं है।
अगला, क्या वास्तव login_shellमें प्रतिनिधित्व करना है? से man bash:
login_shell
यदि यह एक लॉगिन शेल के रूप में शुरू किया गया है तो शेल इस विकल्प को सेट करता है
यही प्रमुख बिंदु है। sudo -i, जैसा कि आप पहले से पढ़े गए उत्तर से जानते हैं, प्रारंभिक लॉगिन अनुकरण करना है। इसलिए इस विकल्प के लिए shoptरिपोर्ट login_shell onकरें। ऐसा मानोsudo -i कि शेल उन फाइलों से गुजरने के लिए मजबूर करता है जो केवल एक लॉगिन प्रक्रिया के दौरान दिखाई देने वाली होती हैं (जो कि इंटरेक्टिव शेल के द्वारा खट्टी नहीं होती हैं)।
अन्य मामलों में, आप पहले से ही शेल का एक उदाहरण चला रहे हैं, इसलिए यह पहली बार में लॉगिन शेल नहीं हो सकता है, और विकल्पों का उद्देश्य अलग है। sudo -sकेवल पढ़ता है $SHELL(जिसका अर्थ है कि आपके डिफ़ॉल्ट शेल को सेट के रूप में दर्शाया गया है /etc/passwd) चर और इसे रूट विशेषाधिकार के साथ चलाता है। ऐसा करने के बराबर है sudo $SHELLया sudo mkshया sudo bash(जो भी आप उपयोग के लिए हो)।
याद रखें मैंने उल्लेख किया है कि मैं mkshउपयोगकर्ता हूं ? इस पर एक नजर डालिए:
$ bash --posix
bash-4.3$ sudo -s
[sudo] password for xieerqi:
DIR:/xieerqi|01:53|skolodya@ubuntu:
$ id
uid=0(root) gid=0(root) groups=0(root)
DIR:/xieerqi|01:53|skolodya@ubuntu:
$ echo $-
imsU
आप जो देख रहे हैं, वह मेरे शेल sudo -sसे कूद गया है, इसके bashलिए मैंने mkshजो विशेषता संकेत दिया है, उसके साथ। और हां, क्योंकि यह एक लॉगिन क्रिया नहीं है, क्योंकि यह bashरिपोर्ट करेगा कि शेल गैर-लॉगिन शेल उदाहरण के रूप में देखा गया है। मेरे मामले में, हालाँकि, आप देखते हैं कि वहाँ $-एक पत्र lनहीं है, जो कि वहाँ होता अगर एक लॉगिन शेल उदाहरण होता।
अंत में, एक ही विचार लागू होता है sudo suऔर sudo su -। बाद में एक लॉगिन शेल का उदाहरण देता है (यानी, लॉगिन के लिए आवश्यक विशिष्ट फाइलें चलेंगी) और पूर्व में केवल एक इंटरैक्टिव खोल (यानी, लॉगिन फाइलें नहीं चलती हैं)।
bash-4.3$ sudo su
[sudo] password for xieerqi:
root@eagle:/home/xieerqi# shopt login_shell
login_shell off
root@eagle:/home/xieerqi# exit
bash-4.3$ sudo su -
[sudo] password for xieerqi:
$ shopt login_shell
login_shell on
इसलिए तकनीकी रूप से, shopt login_shellजिसका कोई संबंध $SHELLनहीं है। इसे इस तरह से सोचें: इसका उद्देश्य यह दिखाना है कि बैश कैसे चलता है। $SHELLकेवल वही प्रतिबिंबित करना है जो आपने सौंपा है /etc/passwd।
लॉगिन शेल और गैर-लॉगिन शेल के बीच के अंतर के लिए, इस उत्तर में unix.stackexchange.com पर अत्यधिक सम्मानित गिल्स द्वारा समझाया गया है ।
अतिरिक्त मज़ा
यहाँ कुछ मजेदार है जिसे आप आज़मा सकते हैं। जैसा कि आप पहले से ही जानते हैं, एक लॉगिन शेल चलेगा .profile(और .bashrcजब से उबंटू .profile ऐसा करने के लिए कॉन्फ़िगर किया गया है ), लेकिन गैर-लॉगइन नर्क उस .bashrcफ़ाइल को चलाएगा । इसलिए हम जांच कर सकते हैं echoकि इनमें से कौन सी कमांड एक लॉगिन शेल चलाती है और कौन सी नहीं, और हम echoलॉगिन शेल के लिए दो लाइनें और नॉन-लॉगइन के लिए केवल एक की उम्मीद करते हैं।
$ echo "echo 'hi,i am .profile'" >> .profile
$ echo "echo 'hi, i am .bashrc'" >> .bashrc
$ sudo -i
hi, i am .bashrc
hi,i am .profile
$ sudo su
hi, i am .bashrc
root@eagle:~# sudo su -
hi, i am .bashrc
hi,i am .profile
$ sudo -s
hi, i am .bashrc
root@eagle:~#
उचित रूप से पर्याप्त है, आउटपुट की दो पंक्तियों वाले लोगों को login_shellसेट करना होगा on।
.profileया समकक्ष), और 2. यह वह शेल है जिसे लॉगिन के लिए शुरू करना चाहिए उपयोगकर्ता, जैसा कि/etc/passwdया समकक्ष में परिभाषित किया गया है ।$SHELLउत्तरार्द्ध में शामिल हैं, आपकेshoptआउटपुट पूर्व के साथ सौदा करते हैं। आमतौर पर, जब शेल (2) को लॉगिन में शुरू किया जाता है, तो इसे (1) के लिए आवश्यक विशिष्ट तरीके से शुरू किया जाता है, इसलिए अर्थों का टकराव होता है।