मैं एक इंटरैक्टिव शेल और एक गैर-इंटरैक्टिव शेल के बीच बुनियादी अंतर को समझता हूं। लेकिन क्या वास्तव में एक गैर-लॉगिन शेल से एक लॉगिन शेल को अलग करता है?
क्या आप एक गैर-लॉगिन इंटरैक्टिव शेल के उपयोग के लिए उदाहरण दे सकते हैं ?
मैं एक इंटरैक्टिव शेल और एक गैर-इंटरैक्टिव शेल के बीच बुनियादी अंतर को समझता हूं। लेकिन क्या वास्तव में एक गैर-लॉगिन शेल से एक लॉगिन शेल को अलग करता है?
क्या आप एक गैर-लॉगिन इंटरैक्टिव शेल के उपयोग के लिए उदाहरण दे सकते हैं ?
जवाबों:
एक लॉगिन शेल एक पहली प्रक्रिया है जो एक इंटरैक्टिव सत्र के लिए लॉग इन करते समय आपकी उपयोगकर्ता आईडी के तहत निष्पादित होती है। लॉगिन प्रक्रिया शेल को एक कन्वेंशन के साथ एक लॉगिन शेल के रूप में व्यवहार करने के लिए कहती है: पासिंग तर्क 0, जो आमतौर पर शेल एक्ज़ीक्यूटेबल का नाम होता है, जिसमें एक -
अक्षर पहले से -bash
होता है (जैसे कि यह सामान्य रूप से होगा bash
। लॉगिन शेल आमतौर पर एक फ़ाइल पढ़ते हैं। वातावरण चर सेट करने जैसी बातें: /etc/profile
और ~/.profile
पारंपरिक बॉर्न शैल के लिए, ~/.bash_profile
इसके साथ ही पार्टी के लिए † , /etc/zprofile
और ~/.zprofile
zsh के लिए † , /etc/csh.login
और ~/.login
csh के लिए, आदि
जब आप एक पाठ कंसोल पर, या 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
और ~/.zshrc
zsh के लिए, /etc/csh.cshrc
और ~/.cshrc
csh के लिए, ENV
POSIX / XSI-कंप्लायंट शेल जैसे डैश, ksh और bash के लिए वैरिएबल द्वारा दर्शाई गई फ़ाइल sh
, $ENV
यदि सेट की गई हो , तो ~/.mkshrc
mksh, आदि के लिए)।
जब कोई शेल स्क्रिप्ट चलाता है या कमांड लाइन पर एक कमांड चलती है, तो यह एक गैर-इंटरैक्टिव, गैर-लॉगिन शेल है। इस तरह के गोले हर समय चलते हैं: यह बहुत सामान्य है कि जब कोई कार्यक्रम किसी अन्य कार्यक्रम को बुलाता है, तो वह वास्तव में उस अन्य कार्यक्रम को लागू करने के लिए एक शेल में एक छोटी सी स्क्रिप्ट चलाता है। कुछ गोले इस मामले में एक स्टार्टअप फ़ाइल पढ़ते हैं (बैश BASH_ENV
चर, zsh रन द्वारा इंगित फ़ाइल चलाता है /etc/zshenv
और ~/.zshenv
), लेकिन यह जोखिम भरा है: शेल को सभी प्रकार के संदर्भों में आमंत्रित किया जा सकता है, और शायद ही कुछ ऐसा हो जो आप कर सकते हैं। कुछ तोड़ो।
† मैं थोड़ा सरल कर रहा हूं, गोर विवरण के लिए मैनुअल देखें।
bash
एक गैर-संवादात्मक लॉगिन शेल के रूप में चलाने के लिए उदाहरण दे सकते हैं ?
echo $- | bash -lx
FOO
एक पर्यावरण चर (यानी .profile
होता है export FOO=something
) तो यह सभी उपप्रकारों सहित उपलब्ध है foo.sh
। आप को बदलते हैं .profile
करने के लिए export FOO=something_else
तो ./foo.sh
अभी भी प्रिंट होगा something
अगली बार जब तक आप लॉग इन करें।
यह बताने के लिए कि क्या आप एक लॉगिन शेल में हैं:
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 विकल्प है जब खोल इस व्यवहार को बाधित करने के लिए शुरू कर दिया है इस्तेमाल किया जा सकता से आदेश निष्पादित करता है। "
एक लॉगिन खोल में, argv[0][0] == '-'
। यह है कि यह जानता है कि यह एक लॉगिन शेल है।
और फिर कुछ स्थितियों में यह अपनी "लॉगिन शेल" स्थिति के आधार पर भिन्न व्यवहार करता है। उदाहरण के लिए, एक शेल, जो एक लॉगिन शेल नहीं है, एक "लॉगआउट" कमांड निष्पादित नहीं करेगा।
man bash
जोर के अनुसार , "एक लॉगिन शेल वह है जिसका तर्क शून्य का पहला वर्ण है - या , किसी ने क्लोजिन विकल्प के साथ शुरू किया है। "
मैं गिल्स द्वारा शानदार उत्तर पर विस्तृत जानकारी दूंगा, लॉगिन शेल प्रकार की जाँच के लिए टिमोथी की विधि के साथ संयुक्त।
यदि आप अपने लिए चीजें देखना पसंद करते हैं, तो स्निपेट और परिदृश्यों को आजमाएं।
जाँच रहा है कि क्या शेल (गैर-) इंटरएक्टिव है
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 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
अधिक जानकारी के लिए यहाँ क्यों नहीं है ।