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) के लिए आवश्यक विशिष्ट तरीके से शुरू किया जाता है, इसलिए अर्थों का टकराव होता है।