लॉगिन शेल कहाँ परिभाषित किया गया है?


16

मैं sudo -i/-s यहाँ अंतर पढ़ रहा था । कमांड का उपयोग करने के बाद shoptयह नोट किया जाता है कि सभी ( sudo su/sudo -i/sudo -s) एक $SHELLही परिणाम प्रदान कर रहे हैं, लेकिन shoptकमांड परिणाम अलग हैं।

तो, कैसे लॉगिन और गैर लॉगिन खोल परिभाषित किया गया है?

shoptपरिणाम कहां से मिलेगा?

इसका संबंध क्यों नहीं है $SHELL?

सूदो सु

givinv@87-109:~$ sudo su
root@87-109:/home/givinv# 
root@87-109:/home/givinv# 
root@87-109:/home/givinv# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
No login shell
root@87-109:/home/givinv# echo $SHELL
/bin/bash
root@87-109:/home/givinv# 
root@87-109:/home/givinv# exit
givinv@87-109:~$ 

सूद-आई

givinv@87-109:~$ sudo -i
root@87-109:~# 
root@87-109:~# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
Login shell
root@87-109:~# echo $SHELL
/bin/bash
root@87-109:~# 

सूद- s

root@87-109:~# sudo -s
root@87-109:~# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
No login shell
root@87-109:~# echo $SHELL
/bin/bash
root@87-109:~# 

7
एक समस्या यह है कि "लॉगिन शेल" के दो अर्थ हैं: 1. यह एक विशिष्ट तरीके से शुरू किए गए शेल का एक उदाहरण है जो विशिष्ट चीजें करता है (जैसे पढ़ना .profileया समकक्ष), और 2. यह वह शेल है जिसे लॉगिन के लिए शुरू करना चाहिए उपयोगकर्ता, जैसा कि /etc/passwdया समकक्ष में परिभाषित किया गया है । $SHELLउत्तरार्द्ध में शामिल हैं, आपके shoptआउटपुट पूर्व के साथ सौदा करते हैं। आमतौर पर, जब शेल (2) को लॉगिन में शुरू किया जाता है, तो इसे (1) के लिए आवश्यक विशिष्ट तरीके से शुरू किया जाता है, इसलिए अर्थों का टकराव होता है।
मूरू

1
@ मुरू का स्पष्टीकरण एक अच्छा है। उदाहरण के लिए यदि आप किसी दूरस्थ मशीन से अपने कंप्यूटर में एस.एस.एच. / usr / sbin / sshd आपके सिस्टम पर एक शेल परिभाषित करेगा $SHELL(और इसे एक छद्म टर्मिनल से कनेक्ट करें) जो बदले में आपके / etc / passwd प्रविष्टि में परिभाषित है। यह शेल एक लॉगिन शेल है और इसके साथ परीक्षण किया जा सकता है if [[ -o login ]]; then echo "I am a login shell"; fi। एक लॉगिन शेल होने के नाते यह उन कार्यों को एक नए सत्र के लिए उपयुक्त करेगा। उदाहरण के लिए स्रोत ~/.zprofileया समान जो संभवतः पर्यावरण चर और किसी भी कस्टम शेल कोड को सेट करेंगे, जिसे आप इस समय चलाना चाहते हैं
the_velour_fog

जवाबों:


17

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


शुक्रिया @ शेर और @ ज़न्ना। अब के बारे में $SHELLऔर login_shell/non-login_shellस्पष्ट किया गया। लेकिन shoptविवरण कहाँ से मिलता है? से है echo $0?
प्रादो

1
@ प्रादुर्भाव मैं कहूंगा, चूँकि पहले वर्ण का $0उपयोग यह निर्दिष्ट करने के लिए किया जाता है कि कोई शैल एक लॉगिन शेल है या नहीं, इसलिए यदि shoptवह उस चर की जाँच करेगा - तो निश्चित रूप से, यह पूरी तरह स्वीकार्य है। हालांकि, आंख से मिलने की तुलना में शायद अधिक है। shoptशायद इस सवाल के लिए, मेरे पास कोई कठिन जवाब नहीं है, क्योंकि मैं बैश के सोर्स कोड से अच्छी तरह परिचित नहीं हूं।
सर्गी कोलोडियाज़नी

@ प्रादो बैश को लॉगिन शेल के रूप में या तो $ 0 का पहला चरित्र होने पर -, या -lविकल्प का उपयोग करके शुरू किया जा सकता है।
मुरु

@ प्रादा आप मैन पेज में बैश के इनवोकेशन और विकल्पों के बारे में पढ़ सकते हैं। उदाहरण के लिए SHELL BUILTIN COMMAND के सेक्शन का कहना है कि login_shell The shell sets this option if it is started as a login shell (see INVOCATION above). The value may not be changed.ऐसा shopt login_shellलगता है कि एक तरह से बैश होने से आपको पता चल सकता है - प्रोग्रामेटिकली यह जानना कि यह कैसे शुरू किया गया था। दूसरा तरीका होगा[[ -o login ]]
The_velour_fog

11

जैसा कि @Serg इस उत्तर में बताता है कि आप किस शेल को चला रहे हैं , यह बताने के लिए , SHELLवैरिएबल केवल वर्तमान उपयोगकर्ता का डिफ़ॉल्ट शेल है जिसे /etc/passwdनिम्न से पढ़ा जा सकता है :

$ grep zanna /etc/passwd
zanna:x:1000:1000:Zanna,,,:/home/zanna:/bin/bash

इसलिए अगर मैं echo $SHELLहमेशा लौटूंगा /bin/bash:

$ zsh
% echo $SHELL
/bin/bash

या नहीं, खोल, एक लॉगिन खोल है एक ell ऑप्ट आयन समय खोल शुरू कर दिया है पर निर्धारित। शेल प्रोग्राम अपनी अन्य सभी सेटिंग्स और चर के साथ इस जानकारी को संग्रहीत करता है। shoptआदेश एक तरह से इस जानकारी और देखने के लिए, यदि संभव हो तो सवाल में विकल्प के लिए, सेट करने के लिए या यह सेट नहीं प्रदान करता है (इस के लिए ऐसा नहीं है login_shellजो, ज़ाहिर है, खोल शुरू करने के लिए इस्तेमाल किया प्रक्रिया पर निर्भर करता है)

sudoकार्यक्रम के विकल्प को निर्धारित कैसे जड़ खोल के इन विभिन्न प्रकार शुरू कर दिया हो जाएगा:

यहाँ छवि विवरण दर्ज करें


1
अच्छे खर्च। मुझे लगता है कि आपने जो बताया है shoptऔर login_shellजो मेरे उत्तर में बेहतर प्रदर्शन करने वाला है।
सर्गी कोलोडियाज़नी

@ धन्यवाद धन्यवाद :) मुझे लगता है कि आपका स्पष्टीकरण अधिक गहन है :)
Zanna

3

man bash:

एक लॉगिन शेल वह है जिसका तर्क शून्य का पहला वर्ण है -, या एक --loginविकल्प के साथ शुरू हुआ है ।

man login:

पासवर्ड प्रविष्टि में उपयुक्त फ़ील्ड के अनुसार $HOME, $SHELL[...] का मान निर्धारित किया गया है।

संक्षेप में:

  • एक शेल एक लॉगिन शेल है यदि इसे एक लॉगिन शेल के रूप में लागू किया गया था।
  • पर्यावरण चर , उदाहरण के लिए, इनवोकिंग प्रोग्राम $SHELLद्वारा loginया सेट किया गया है su। शेल स्वयं इसे सेट नहीं करता है।
  • shopt वर्तमान में प्रभाव में शेल विकल्प दिखाता है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.