इंटरएक्टिव लॉगिन और गैर-इंटरैक्टिव गैर-लॉगिन शेल अंतर करें


25

मैं इन चार शब्दों को अलग करने की कोशिश कर रहा हूं , गैर-लॉगिन, इंटरैक्टिव और गैर-इंटरैक्टिव :

  • इंटरेक्टिव - लॉगिन शेल
  • इंटरैक्टिव - गैर-लॉगिन शेल
  • गैर-संवादात्मक - लॉगिन शेल
  • गैर-इंटरैक्टिव - गैर-लॉगिन शेल

जैसा कि मुझे
इंटरेक्टिव - नॉन लॉगइन शेल समझ में आता है : सिस्टम शुरू करें, सिस्टम में लॉग इन करें और टर्मिनल और
नॉन-इंटरेक्टिव - लॉगिन शेल खोलें : सिस्टम में टेलनेट और लॉग इन करें

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

जवाबों:


38

केवल वास्तविक गलत धारणा जो आपको लगती है, वह है गैर-संवादात्मक, लॉगिन शेल।

संक्षेप में ( अधिक विवरण के लिए यहां देखें), उदाहरण के साथ:

  • इंटरेक्टिव लॉगिन शेल: आप उदाहरण के लिए किसी दूरस्थ कंप्यूटर में लॉग इन करते हैं ssh। वैकल्पिक रूप से, आप अपने स्थानीय मशीन ( Ctrl+ Alt+ F1) पर एक ट्टी पर जाते हैं और वहां लॉग इन करते हैं।

  • संवादात्मक गैर-लॉगिन शेल: एक नया टर्मिनल खोलें।

  • गैर-संवादात्मक गैर-लॉगिन शेल: एक स्क्रिप्ट चलाएँ। सभी स्क्रिप्ट अपने स्वयं के उप-भाग में चलती हैं और यह शेल इंटरएक्टिव नहीं है। यह केवल स्क्रिप्ट को निष्पादित करने के लिए खुलता है और स्क्रिप्ट समाप्त होने के तुरंत बाद बंद हो जाता है।

  • गैर-संवादात्मक लॉगिन शेल: यह अत्यंत दुर्लभ है, और आप इसका सामना करने के लिए इसके विपरीत हैं। लॉन्च करने का एक तरीका है echo command | ssh server। जब sshएक कमांड के बिना लॉन्च किया जाता है (इसलिए sshइसके बजाय रिमोट शेल पर ssh commandचलेगा command) यह एक लॉगिन शेल शुरू करता है। अगर stdinकी sshएक tty नहीं है, यह एक गैर-सहभागी खोल शुरू होता है। यही कारण है कि echo command | ssh serverएक गैर-संवादात्मक लॉगिन शेल लॉन्च करेगा। आप भी एक के साथ शुरू कर सकते हैंbash -l -c command

यदि आप इसके साथ खेलना चाहते हैं, तो आप विभिन्न प्रकार के शेल के लिए परीक्षण कर सकते हैं:

  • क्या यह खोल संवादात्मक है?

    $-चर की सामग्री की जाँच करें । इंटरैक्टिव गोले के लिए, इसमें शामिल होंगे i:

    ## Normal shell, just running a command in a terminal: interacive
    $ echo $-
    himBHs
    ## Non interactive shell
    $ bash -c 'echo $-'
    hBc
  • क्या यह एक लॉगिन शेल है?

    यह जाँचने का कोई पोर्टेबल तरीका नहीं है , लेकिन बैश के लिए, आप यह जाँच सकते हैं कि login_shellविकल्प सेट है या नहीं:

    ## Normal shell, just running a command in a terminal: interacive
    $ shopt login_shell 
    login_shell     off
    ## Login shell; 
    $ ssh localhost
    $ shopt login_shell 
    login_shell     on

इस सब को एक साथ रखते हुए, यहां प्रत्येक संभावित प्रकार के खोल में से एक है:

## Interactive, non-login shell. Regular terminal
$ echo $-; shopt login_shell
himBHs
login_shell     off

## Interactive login shell
$ bash -l
$ echo $-; shopt login_shell
himBHs
login_shell     on

## Non-interactive, non-login shell
$ bash -c 'echo $-; shopt login_shell'
hBc
login_shell     off

## Non-interactive login shell
$ echo 'echo $-; shopt login_shell' | ssh localhost
Pseudo-terminal will not be allocated because stdin is not a terminal.
hBs
login_shell     on

मैं यह स्पष्ट करना चाहता हूं कि 1) मेरे लिए लॉगिन का मतलब है, सिस्टम शुरू करना, सिस्टम में लॉगिन करना और टर्मिनल 2 खोलना) टेलनेट या ssh करना इंटरएक्टिव लॉगिन शेल का मतलब है, उदाहरण के लिए मैंने जो दिया था non-interactive login shellवह गलत है।
डेज़ी

स्पष्टीकरण के लिए @ डेज़ी धन्यवाद; उत्तर संपादित किया गया।
टेराडॉन

ठीक है और gui अप्रासंगिक है, इंटरैक्टिव गैर-लॉगिन शेल: बस स्थानीय रूप से एक नया टर्मिनल खोलें या टेलनेट या ssh के माध्यम से दूरस्थ रूप से
daisy

@ डेज़ी हाँ, सही के बारे में लगता है। लेकिन कृपया मूरू के उत्तर को ध्यान से पढ़ें क्योंकि यह बताता है कि अनिवार्य रूप से, यह शब्दार्थ का विषय है और केवल शेल द्वारा पढ़ी जाने वाली स्टार्टअप फाइलों को प्रभावित करता है। विभिन्न शैल प्रकारों के और भी अधिक व्यापक अवलोकन के लिए यहां देखें ।
टेराडन

गैर-संवादात्मक लॉगिन शेल असामान्य नहीं हैं, उदाहरण के लिए git उनका उपयोग करता है, IIRC।
क्ज़गार

6

अनिवार्य रूप से, एक शेल लॉगिन है या नहीं, इंटरैक्टिव है या बिल्कुल एक कारण से मायने नहीं रखता है:

आरंभिक फ़ाइलें और डिफ़ॉल्ट विकल्प सेट इस बात पर निर्भर करते हैं कि कोई शेल लॉगिन है या नहीं और इंटरेक्टिव है या नहीं।

इसके विपरीत, एक शेल लॉगिन है या नहीं या इंटरैक्टिव या पूरी तरह से इस्तेमाल किए गए आह्वान पर निर्भर करता है - सटीक कमांड नाम और विकल्प।

दो गुण अन्यथा orthogonal हैं - चाहे कोई शेल लॉगिन हो या नहीं, यह निर्धारित करने पर कोई असर नहीं है कि यह इंटरैक्टिव है या नहीं।

यदि इनमें से कोई भी सत्य है, तो बैश एक लॉगिन शेल शुरू करता है:

  • argv[0]कमांड का नाम, जिसे लागू किया गया था, a से शुरू होता है -
  • -lविकल्प निर्दिष्ट

यदि इनमें से कोई भी सत्य हो तो इसी तरह, बैश एक इंटरैक्टिव शेल शुरू करता है:

  • इसे निष्पादित करने के लिए एक फ़ाइल निर्दिष्ट नहीं की गई थी (यानी, कमांड नहीं थी bash some/file) या चलाने के लिए एक कमांड स्ट्रिंग ( bash -c 'foo') (वास्तविक स्थिति थोड़ी अधिक जटिल है, मैनुअल देखें)
  • -iविकल्प निर्दिष्ट किया गया था

विशेष रूप से (और विरोधाभासी रूप से), बाद का तात्पर्य है कि bash -ic 'foo'एक इंटरैक्टिव शेल शुरू होता है।

तो निम्नलिखित में एक लॉगिन, इंटरेक्टिव शेल शुरू होता है, भले ही इसके बारे में कुछ भी इंटरएक्टिव न हो और इनवोकेशन का लॉग इन से कोई लेना-देना नहीं है:

bash -lic true

कंसोल या GUI के माध्यम से लॉग इन करने पर एक लॉगिन शेल शुरू होता है (या शायद नहीं) पूरी तरह से उपयुक्त इनवोकेशन का उपयोग करके लॉगिन प्रक्रिया का एक प्रभाव है।

परिस्थितियों और प्रभावों को बॅश मैनुअल, स्टार्टअप फाइलों पर अनुभाग में विस्तार से वर्णित किया गया है ।


भ्रम का एक प्रमुख स्रोत यह है कि "लॉगिन" शेल के लिए एक और सामान्य अर्थ है:

उपयोगकर्ता का लॉगिन शेल उस उपयोगकर्ता की passwdप्रविष्टि (जो कि /etc/passwdLDAP या किसी अन्य स्रोत से आ सकता है) में परिभाषित शेल है ।

loginकार्यक्रम, SSH, आदि एक के रूप में इस खोल शुरू लॉगिन भावना जवाब के बाकी हिस्सों में मतलब में खोल - एक प्रमुख के साथ -आदेश के नाम पर, आम तौर पर। यदि आप विशेष रूप से भ्रमित होना चाहते हैं, तो आप कह सकते हैं:

कुछ लॉगिन प्रक्रियाएं उपयोगकर्ता के लॉगिन शेल को लॉगिन शेल के रूप में शुरू करती हैं।

ध्यान दें कि GUI लॉगिन एक लॉगिन शेल को शुद्ध रूप से शुरू करता है क्योंकि डेवलपर्स ने इसे सुविधाजनक समझा - LightDM लॉगिन पर एक स्क्रिप्ट चलाता है जो स्पष्ट रूप से इंटरैक्टिव नहीं है और निश्चित रूप से उपयोगकर्ता के लॉगिन शेल (दूसरे अर्थ में) पर निर्भर नहीं करता है। हालांकि, लॉगिन प्रबंधक शुरू करने वाले प्रदर्शन प्रबंधक पर निर्भर नहीं होते हैं, हालांकि - उनमें से सभी नहीं करते हैं, और वेनलैंड और गनोम पर, लॉगिन प्रक्रिया बिल्कुल भी स्क्रिप्ट का उपयोग नहीं करती है।


3

लॉगिन शेल:

पहली प्रक्रिया जब हम सत्र में लॉग इन करते हैं तो हमारी यूजर आईडी के तहत निष्पादित होती है। लॉगिन प्रक्रिया शेल को एक कन्वेंशन के साथ एक लॉगिन शेल के रूप में व्यवहार करने के लिए कहती है: पासिंग तर्क 0, जो आम तौर पर शेल निष्पादन योग्य का नाम है, एक "-" वर्ण से जुड़ा हुआ है

इंटरएक्टिव शेल:

एक ट्टी पर उपयोगकर्ता इनपुट से कमांड पढ़ता है। अन्य बातों के अलावा, ऐसा शेल सक्रियण पर स्टार्टअप फ़ाइलों को पढ़ता है, एक शीघ्रता प्रदर्शित करता है, और डिफ़ॉल्ट रूप से नौकरी नियंत्रण को सक्षम करता है। उपयोगकर्ता शेल के साथ बातचीत कर सकता है। एक स्क्रिप्ट चलाने वाला शेल हमेशा एक गैर-इंटरैक्टिव शेल होता है।

सीधे शब्दों में कहें: इंटरएक्टिव शेल को उपयोगकर्ता इनपुट की आवश्यकता होती है, जबकि गैर-इंटरैक्टिव शेल स्क्रिप्ट द्वारा चलाए जाते हैं और उपयोगकर्ता इनपुट की आवश्यकता नहीं होती है।


तो जो उदाहरण दिए गए हैं, वे सही हैं।
डेज़ी

हाँ अपने सही जगह पर डेज़ी।
जॉर्ज उदेन

1
@ डेज़ी नहीं! GUI का इससे कोई लेना-देना नहीं है। यह कमांड लाइन के गोले के बारे में है, न कि ग्राफिकल गोले (जो भी मौजूद हैं लेकिन एक अलग जानवर हैं)।
तेरह

1
@George नहीं, दो गलतियाँ हैं: GUI के माध्यम से लॉग इन करने से लॉगिन शेल (या किसी अन्य प्रकार का प्रासंगिक शेल) शुरू नहीं होता है और टेलनेट के माध्यम से रिमोट सिस्टम में लॉगिंग एक टेलनेट शेल शुरू करता है, लेकिन ssh के माध्यम से एक इंटरैक्टिव लॉगिन शुरू होता है खोल।
टेराडन

1
@ जॉर्ज वास्तव में, मैं सही खड़ा हूं। कुछ GUI लॉगिन प्रबंधक पढ़ने के लिए एक लॉगिन शेल शुरू कर सकते हैं .profile(मुझे लगा कि वे सिर्फ .profileमैन्युअल रूप से स्रोत हैं , लेकिन मैं गलत हो सकता हूं )।
टेराडन

0

मैं उल्लेख करना चाहता हूं, कि आप एक इंटरेक्टिव लॉगिन शेल शुरू कर सकते हैं:

  1. sudo /bin/loginअपने क्रेडेंशियल्स में निष्पादित और टाइप करना
  2. क्रियान्वित exec -l /bin/bash
  3. क्रियान्वित su -
  4. और उपर्युक्त उत्तर की तरह, ssh का उपयोग करके और एक दूरस्थ मशीन में लॉगिन करें

इसके अलावा, आप चेक (बैश में) कर सकते हैं यदि यह शेल टाइप करके लॉगिन है echo $0और यदि आउटपुट डैश से शुरू होता है -, तो यह लॉगिन शेल है।

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