लॉगिन शेल और नॉन-लॉगिन शेल के बीच अंतर?


318

मैं एक इंटरैक्टिव शेल और एक गैर-इंटरैक्टिव शेल के बीच बुनियादी अंतर को समझता हूं। लेकिन क्या वास्तव में एक गैर-लॉगिन शेल से एक लॉगिन शेल को अलग करता है?

क्या आप एक गैर-लॉगिन इंटरैक्टिव शेल के उपयोग के लिए उदाहरण दे सकते हैं ?


45
मुझे लगता है कि यह सवाल बेहतर है कि " हमें लॉगिन और गैर-लॉगिन गोले में अंतर क्यों करना चाहिए?" वेब पर कई जगह पहले से ही हमें बताती हैं कि प्रत्येक फ़ाइल पढ़ने वाले स्टार्टअप के संदर्भ में क्या अंतर हैं; लेकिन उनमें से कोई भी संतोषजनक और ठोस तरीके से "क्यों" का जवाब नहीं देता है। उदाहरण ऐसे मामलों का उपयोग करें जहां आप निश्चित रूप से एक या दूसरे व्यवहार को नहीं चाहते हैं
काल

2
@ काल यह एक अलग प्रश्न होगा, क्योंकि यहाँ कोई उत्तर वास्तव में नहीं है। संपादित करें: वास्तव में, यहाँ यह है: एक गैर-लॉगिन शेल पर एक लॉगिन शेल क्यों ?
स्किप्पी ले ग्रैंड गौरू

जवाबों:


304

एक लॉगिन शेल एक पहली प्रक्रिया है जो एक इंटरैक्टिव सत्र के लिए लॉग इन करते समय आपकी उपयोगकर्ता आईडी के तहत निष्पादित होती है। लॉगिन प्रक्रिया शेल को एक कन्वेंशन के साथ एक लॉगिन शेल के रूप में व्यवहार करने के लिए कहती है: पासिंग तर्क 0, जो आमतौर पर शेल एक्ज़ीक्यूटेबल का नाम होता है, जिसमें एक -अक्षर पहले से -bashहोता है (जैसे कि यह सामान्य रूप से होगा bash। लॉगिन शेल आमतौर पर एक फ़ाइल पढ़ते हैं। वातावरण चर सेट करने जैसी बातें: /etc/profileऔर ~/.profileपारंपरिक बॉर्न शैल के लिए, ~/.bash_profileइसके साथ ही पार्टी के लिए , /etc/zprofileऔर ~/.zprofilezsh के लिए , /etc/csh.loginऔर ~/.logincsh के लिए, आदि

जब आप एक पाठ कंसोल पर, या SSH के माध्यम से, या साथ में प्रवेशsu - करते हैं, तो आपको एक इंटरैक्टिव लॉगिन शेल मिलता है । जब आप ग्राफिकल मोड (एक एक्स डिस्प्ले मैनेजर पर ) में लॉग इन करते हैं, तो आपको एक सत्र प्रबंधक या विंडो मैनेजर नहीं मिलता है, इसके बजाय आपको एक लॉगिन शेल नहीं मिलता है।

एक गैर-संवादात्मक लॉगिन शेल चलाना दुर्लभ है , लेकिन कुछ एक्स सेटिंग्स तब करते हैं जब आप एक प्रदर्शन प्रबंधक के साथ लॉग इन करते हैं, ताकि प्रोफाइल फ़ाइलों को पढ़ने के लिए व्यवस्थित किया जा सके। अन्य सेटिंग्स (यह वितरण पर और प्रदर्शन प्रबंधक पर निर्भर करता है) पढ़ें /etc/profileऔर ~/.profileस्पष्ट रूप से, या उन्हें न पढ़ें। एक गैर-संवादात्मक लॉगिन शेल प्राप्त करने का दूसरा तरीका मानक इनपुट के माध्यम से पारित एक कमांड के साथ दूरस्थ रूप से लॉग इन करना है जो कि टर्मिनल नहीं है, उदाहरण के लिए ssh example.com <my-script-which-is-stored-locally( ssh example.com my-script-which-is-on-the-remote-machineजिसका विरोध गैर-संवादात्मक, गैर-लॉगिन शेल चलाता है)।

जब आप किसी मौजूदा सत्र (स्क्रीन, एक्स टर्मिनल, एमएसीएस टर्मिनल बफर, दूसरे के अंदर एक शेल, आदि) में एक टर्मिनल शुरू करते हैं, तो आपको एक इंटरैक्टिव, गैर-लॉगिन शेल मिलता है। वह शेल एक शेल कॉन्फ़िगरेशन फ़ाइल पढ़ सकता है (जैसे ~/.bashrcकि bash के लिए bash, /etc/zshrcऔर ~/.zshrczsh के लिए, /etc/csh.cshrcऔर ~/.cshrccsh के लिए, ENVPOSIX / XSI-कंप्लायंट शेल जैसे डैश, ksh और bash के लिए वैरिएबल द्वारा दर्शाई गई फ़ाइल sh, $ENVयदि सेट की गई हो , तो ~/.mkshrcmksh, आदि के लिए)।

जब कोई शेल स्क्रिप्ट चलाता है या कमांड लाइन पर एक कमांड चलती है, तो यह एक गैर-इंटरैक्टिव, गैर-लॉगिन शेल है। इस तरह के गोले हर समय चलते हैं: यह बहुत सामान्य है कि जब कोई कार्यक्रम किसी अन्य कार्यक्रम को बुलाता है, तो वह वास्तव में उस अन्य कार्यक्रम को लागू करने के लिए एक शेल में एक छोटी सी स्क्रिप्ट चलाता है। कुछ गोले इस मामले में एक स्टार्टअप फ़ाइल पढ़ते हैं (बैश BASH_ENVचर, zsh रन द्वारा इंगित फ़ाइल चलाता है /etc/zshenvऔर ~/.zshenv), लेकिन यह जोखिम भरा है: शेल को सभी प्रकार के संदर्भों में आमंत्रित किया जा सकता है, और शायद ही कुछ ऐसा हो जो आप कर सकते हैं। कुछ तोड़ो।

मैं थोड़ा सरल कर रहा हूं, गोर विवरण के लिए मैनुअल देखें।


2
क्या आप bashएक गैर-संवादात्मक लॉगिन शेल के रूप में चलाने के लिए उदाहरण दे सकते हैं ?
पायोत्र डोब्रोगोस्ट

13
@PiotrDobrogostecho $- | bash -lx
गाइल्स

1
मुझे नहीं पता कि यह सामान्य रूप से सच है, लेकिन मैं यह नोट करना चाहता हूं कि जब मैं एक नया टर्मिनल खोलता हूं (डिफ़ॉल्ट सेटिंग्स का उपयोग करके ओएक्सएक्स पर), तो मुझे एक लॉगिन शेल मिलता है, भले ही मैं अपने उपयोगकर्ता नाम या पासवर्ड में कभी भी टाइप न करूं।
केविन व्हीलर

4
@ केविनव्हीलर ओएसएक्स पर, डिफ़ॉल्ट रूप से, टर्मिनल एप्लिकेशन एक लॉगिन शेल चलाता है। (जैसा कि मैं समझाता हूं, शेल शुरू करने वाला प्रोग्राम यह तय करता है कि शेल एक लॉगिन शेल के रूप में कार्य करता है।) यह चीजें करने का सामान्य तरीका नहीं है।
गिल्स

2
@IAmJulianAcosta यदि FOOएक पर्यावरण चर (यानी .profileहोता है export FOO=something) तो यह सभी उपप्रकारों सहित उपलब्ध है foo.sh। आप को बदलते हैं .profileकरने के लिए export FOO=something_elseतो ./foo.shअभी भी प्रिंट होगा somethingअगली बार जब तक आप लॉग इन करें।
गाइल्स

48

यह बताने के लिए कि क्या आप एक लॉगिन शेल में हैं:

prompt> echo $0
-bash # "-" is the first character. Therefore, this is a login shell.

prompt> echo $0
bash # "-" is NOT the first character. This is NOT a login shell.

बैश में, आप भी उपयोग कर सकते हैं shopt login_shell:

prompt> shopt login_shell
login_shell     off

(या onएक लॉगिन शेल में)।

जानकारी में पाया जा सकता है man bash(मंगलाचरण के लिए खोज)। यहाँ एक अंश है:

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

इसका परीक्षण आप स्वयं कर सकते हैं। कभी भी आप SSH, आप एक लॉगिन शेल का उपयोग कर रहे हैं। उदाहरण के लिए:

prompt> ssh user@localhost
user@localhost's password:
prompt> echo $0
-bash

लॉगिन शेल का उपयोग करने का महत्व यह है कि किसी भी सेटिंग को /home/user/.bash_profileनिष्पादित किया जाएगा। यदि आपकी रुचि है (तो man bash)

"जब बैश को एक इंटरेक्टिव लॉगिन शेल के रूप में, या --login विकल्प के साथ एक गैर-इंटरैक्टिव शेल के रूप में आमंत्रित किया जाता है, तो यह पहले फ़ाइल / आदि / प्रोफाइल से कमांड को पढ़ता है और निष्पादित करता है, यदि वह फ़ाइल मौजूद है। उस फ़ाइल को पढ़ने के बाद, यह के लिए लग रहा है ~/.bash_profile, ~/.bash_loginऔर ~/.profileइसी क्रम में, और पढ़ता है और पहले एक है कि मौजूद है और पठनीय है। --noprofile विकल्प है जब खोल इस व्यवहार को बाधित करने के लिए शुरू कर दिया है इस्तेमाल किया जा सकता से आदेश निष्पादित करता है। "


23

एक लॉगिन खोल में, argv[0][0] == '-'। यह है कि यह जानता है कि यह एक लॉगिन शेल है।

और फिर कुछ स्थितियों में यह अपनी "लॉगिन शेल" स्थिति के आधार पर भिन्न व्यवहार करता है। उदाहरण के लिए, एक शेल, जो एक लॉगिन शेल नहीं है, एक "लॉगआउट" कमांड निष्पादित नहीं करेगा।


4
man bashजोर के अनुसार , "एक लॉगिन शेल वह है जिसका तर्क शून्य का पहला वर्ण है - या , किसी ने क्लोजिन विकल्प के साथ शुरू किया है। "
Wildcard

18

एक जीयूआई में एक नए टर्मिनल में शुरू किया गया एक शेल एक इंटरैक्टिव गैर-लॉगिन शेल होगा। यह आपके .bashrc स्रोत होगा, लेकिन उदाहरण के लिए आपका .profile नहीं।


4

मैं गिल्स द्वारा शानदार उत्तर पर विस्तृत जानकारी दूंगा, लॉगिन शेल प्रकार की जाँच के लिए टिमोथी की विधि के साथ संयुक्त।

यदि आप अपने लिए चीजें देखना पसंद करते हैं, तो स्निपेट और परिदृश्यों को आजमाएं।

जाँच रहा है कि क्या शेल (गैर-) इंटरएक्टिव है

if tty -s; then echo 'This is interactive shell.'; else echo 'This is non-interactive shell.'; fi

जाँच रहा है कि क्या शेल (गैर-) लॉगिन है

यदि आउटपुट से echo $0शुरू होता है -, तो यह लॉगिन शेल ( echo $0आउटपुट उदाहरण :) है -bash। अन्यथा यह गैर-लॉगिन शेल ( echo $0आउटपुट उदाहरण :) है bash

if echo $0 | grep -e ^\- 2>&1>/dev/null; then echo "This is login shell."; else echo "This is non-login shell."; fi;

चलो एक साथ दोनों जानकारी प्राप्त करने के लिए ऊपर के दोनों को एक साथ जोड़ते हैं:

THIS_SHELL_INTERACTIVE_TYPE='non-interactive'; 
THIS_SHELL_LOGIN_TYPE='non-login'; 
if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi; 
if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi;
echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"

परिदृश्य:

विशेष विकल्पों के बिना विशिष्ट एसएसएच सत्र

ssh ubuntu@34.247.105.87
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-1083-aws x86_64)

ubuntu@ip-172-31-0-70:~$ THIS_SHELL_INTERACTIVE_TYPE='non-interactive';
ubuntu@ip-172-31-0-70:~$ THIS_SHELL_LOGIN_TYPE='non-login';
ubuntu@ip-172-31-0-70:~$ if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi;
ubuntu@ip-172-31-0-70:~$ if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi;
ubuntu@ip-172-31-0-70:~$ echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"

interactive/login

स्क्रिप्ट चलाना या नए शेल के माध्यम से स्पष्ट रूप से निष्पादित करना

ubuntu@ip-172-31-0-70:~$  bash -c 'THIS_SHELL_INTERACTIVE_TYPE='non-interactive'; THIS_SHELL_LOGIN_TYPE='non-login'; if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi; if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi; 
echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"'

interactive/non-login

स्थानीय स्क्रिप्ट को दूरस्थ रूप से चलाना

ssh ubuntu@34.247.105.87 < checkmy.sh
Pseudo-terminal will not be allocated because stdin is not a terminal.
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-1083-aws x86_64)

non-interactive/login

दूरस्थ रूप से ssh पर कमांड चलाना

ssh ubuntu@34.247.105.87 'THIS_SHELL_INTERACTIVE_TYPE='non-interactive'; THIS_SHELL_LOGIN_TYPE='non-login'; if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi; if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi; echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"'

non-interactive/non-login

-tस्विच के साथ दूरस्थ रूप से ssh पर कमांड चलाना

आप स्पष्ट रूप से इंटरैक्टिव शेल का अनुरोध कर सकते हैं जब आप -tस्विच का उपयोग करके ssh के माध्यम से दूरस्थ रूप से कमांड चलाना चाहते हैं ।

ssh ubuntu@34.247.105.87 -t 'THIS_SHELL_INTERACTIVE_TYPE='non-interactive'; THIS_SHELL_LOGIN_TYPE='non-login'; if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi; if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi; echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"'

interactive/non-login

नोट: विषय पर दूरस्थ कमांड चलाना login shellअधिक जानकारी के लिए यहाँ क्यों नहीं है

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