क्या यह संभव है कि वहाँ एक लॉगिन शेल हो जो इंटरैक्टिव नहीं है?


11

इस फ्लोचार्ट की व्याख्या करने में

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

मैंने पाया कि आदमी बैश में:

जब बैश को एक इंटरेक्टिव लॉगिन शेल के रूप में, या - क्लोजर विकल्प के साथ एक गैर-इंटरैक्टिव शेल के रूप में लागू किया जाता है, तो यह पहले फ़ाइल / आदि / प्रोफाइल से कमांड को पढ़ता है और निष्पादित करता है, यदि वह फ़ाइल मौजूद है।

जिसमें कहा गया है कि इंटरेक्टिव लॉगइन गोले /etc/profile(बिना - नोप्रोफाइल) पढ़े

इसके अलावा, गैर-इंटरेक्टिव गोले विकल्प के साथ --loginपढ़ें/etc/profile

ऐसा लगता है कि कुछ संभव लॉगिन गोले (जिसमें $0शुरू होता है -) को छोड़ दिया जा रहा है जो गैर-संवादात्मक हो (एक स्क्रिप्ट चलाएं, जितना संभव हो उतना सरल date) नहीं पढ़ सकता (स्रोत) /etc/profile

इस विचार की पुष्टि या खंडन करने के लिए:

पहले मैंने उपयोग करने की कोशिश की su -l -, जो -पहले चरित्र के रूप में एक लॉगिन शेल शुरू करता है, लेकिन मैं इसे गैर-संवादात्मक बनाने में विफल रहता हूं (और इसकी जांच करने के लिए परीक्षण प्रस्तुत करने में सक्षम हो)।

जैसे कोई बुला रहा हो

$ bash -c 'date' -bash

लॉगिन शेल होने की सूचना नहीं देता है (भले ही पहला वर्ण हो -)।

विवरण प्रकट करने के लिए इसे आज़माएं:

   $ bash -c 'echo "$0 $- ||$(shopt -p login_shell)||";date' -bash
      -bash hBc ||shopt -u login_shell||
      Fri Aug 19 06:32:31 EDT 2016

$0एक है -पहली चरित्र के रूप में, कोई iके मूल्य में (सहभागी) $-लेकिन यह एक के रूप में दर्ज नहीं किया जाता login_shell(-u)। इस मामले में, / etc / प्रोफ़ाइल पढ़ा नहीं गया था, लेकिन मुझे यकीन नहीं है कि यह सही परीक्षा है।


इस उत्तर में "दुर्लभ गैर-संवादात्मक लॉगिन गोले" का भी उल्लेख है, जो इस प्रश्न के लिए पर्याप्त विशिष्ट नहीं है।


इस आदमी के समापन कि है /etc/profileहमेशा पढ़ा जाता है।

सारांश तालिका पढ़ें: दोनों इंटरैक्टिव और गैर-इंटरैक्टिव लॉगिन गोले पढ़ें /etc/profile


और, यदि इस पृष्ठ के उदाहरण सही हैं:

Some examples

$ su bob                   # interactive non-login shell
$ su - bob                 # interactive login shell
$ exec su - bob            # interactive login shell
$ exec su - bob -c 'env'   # non-interactive login shell
$ ssh bob@example.com      # interactive login shell, `~/.profile`
$ ssh bob@example.com env  # non-interactive non-login shell, `~/.bashrc`

पढ़ी गई exec su - bob -c 'env'रिपोर्टों का परीक्षण /etc/profile


संक्षेप में:

क्या एक गैर-संवादात्मक लॉगिन शेल (जिसे - एल्गिन या -एल के साथ नहीं कहा जाता है) होना संभव है?

और अगर सच है, तो क्या यह /etc/profileफ़ाइल पढ़ रहा है?

यदि उपरोक्त सत्य है, तो हमें यह निष्कर्ष निकालना होगा कि सभी लॉगिन गोले [संवादात्मक (या नहीं)] पढ़ें / आदि / प्रोफ़ाइल (बिना --noprofileविकल्प के)।

नोट: यह पता लगाने के लिए कि / etc / प्रोफाइल पढ़ी जा रही है, बस इस कमांड में फाइल की शुरुआत में जोड़ें:

echo "'/etc/profile' is being read"

जवाबों:


2

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

$ ln -s /bin/bash ./-bash
$ echo 'shopt -p login_shell; echo $-' | HOME=/none PATH=.:$PATH -bash
shopt -s login_shell
hB

आपका प्रयास bash -c date -bashकाम नहीं आया क्योंकि यह शेल को एक लॉगिन शेल नहीं बताता है: शून्य तर्क है bash, नहीं -bash। बैश शुरू कर दिया है के बाद, यह चर सेट $0करने के लिए -bashzeroth तर्क के बजाय, लेकिन zeroth तर्क क्या मायने रखती है।

आप su -lया उसके साथ एक गैर-सक्रिय लॉगिन शेल चला सकते हैं su -, लेकिन आपको मानक इनपुट के लिए एक टर्मिनल नहीं होने की व्यवस्था करने की आवश्यकता है, जबकि अभी भी अधिकृत होने में सक्षम है (पासवर्ड टाइप किए बिना, या आपके पासवर्ड के शुरू होने की व्यवस्था करने के लिए। इनपुट)। यह सुडो के साथ आसान हो सकता है: sudo trueएक उपस्थिति क्रेडेंशियल प्राप्त करने के लिए चलाएं , फिर जबकि क्रेडेंशियल अभी भी मान्य रन है echo 'shopt -p login_shell; echo $-' | sudo -i

लॉगिन शेल और गैर-लॉगिन शेल के बीच अंतर भी देखें


4

मैंने ग्राफ़िकल लॉगिन वातावरण देखा है जो करते हैं:

exec "$SHELL" -l -c 'exec start-window-or-session-manager'

या इसके बराबर:

exec -a "-$SHELL" "$SHELL" <<EOF
exec start-window-or-session-manager
EOF

ताकि सत्र आरंभीकरण फ़ाइल ( ~/.profileबॉर्न की तरह गोले के लिए (और /etcकुछ के लिए इसी वाले )) को पढ़ा और लागू किया जाए।

पहले वाला सभी गोले के साथ काम नहीं करता है। -lगोले की एक बड़ी संख्या द्वारा समर्थित है, लेकिन सभी नहीं, और कुछ पर, जैसे csh/ tcsh, के साथ उपयोग नहीं किया जा सकता है -c। सभी गोले द्वारा समझा argv[0]जा रहा -है के पहले चरित्र के रूप में, हालांकि यह है कि क्या loginवे गोले लॉगिन गोले बताने के लिए उपयोग करता है।

दूसरे मामले में, उस शेल की गति एक ttyउपकरण के अलावा कुछ है ( <<एक अस्थायी नियमित फ़ाइल, या शेल के आधार पर एक पाइप द्वारा कार्यान्वित की जाती है), इसलिए शेल इंटरएक्टिव नहीं है (इंटरेक्टिव होने की परिभाषा जब एक मानव इंटरैक्ट करता है इसके साथ)।


पहला --loginविकल्प का उपयोग कर रहा है। दूसरे के लिए, अगर मुझे exec -a "-bash" "bash" <<<"shopt -p login_shell; echo $0 $-"मिलता है (सी qoutes में एन्कोडेड) $'/etc/profile read\nshopt -s login_shell\nbash himBH'तो, यह लॉगिन है लेकिन यह इंटरैक्टिव है। हमें लॉगिन और गैर-संवादात्मक चाहिए । ऐसा क्या है जो मुझे याद आ रहा है?

@sorontar, साथ <<<"$-", कि $-क्योंकि दोहरे उद्धरण चिह्नों का बुला खोल से विस्तार होता है। कहा जाता है कि शेल इंटरएक्टिव नहीं है क्योंकि इसकी स्टड एक टटी नहीं है।
स्टीफन चेज़लस

आह, हाँ, आप सही हैं, सर। हालांकि, गलती को सुधारते हुए, हम यह कर सकते हैं: exec -a "-bash" "bash" <<\EOF shopt -p login_shell; echo $0 $- EOFयह पुष्टि प्राप्त करने के लिए: $'/etc/profile read stdin: is not a tty shopt -s login_shell -bash hB'तो, हाँ, एक गैर-संवादात्मक लॉगिन शेल संभव है, और यह अभी भी पढ़ा है /etc/profile। क्या हमें यह निष्कर्ष निकालना चाहिए कि सभी लॉगिन गोले पढ़ें /etc/profile?

ksh यह स्पष्ट करता है कि यह एक गैर-संवादात्मक लॉगिन शेल है , कोशिश करें exec -a "-ksh" "ksh" <<\EOF echo $0; set -o EOF:)।

1
@sorontar, मुझे लगता है कि जब आप लॉगिन गोले के रूप में पुकारते हैं, तो आप उनके सत्र आरंभीकरण फ़ाइल (एस) को पढ़ने के लिए अधिकांश शेल कार्यान्वयनों की अपेक्षा कर सकते हैं। वे शेल कार्यान्वयन और संस्करण पर निर्भर हैं। के मामले में bash, स्टार्ट-अप फ़ाइल हैंडलिंग बहुत गड़बड़-अप आईएमओ है, आप पाएंगे कि कुछ सिस्टम ने इसे और अधिक भिन्नता को जोड़ते हुए अधिक उचित व्यवहार करने के लिए पैच किया है।
स्टीफन चेज़ेलस

3

हां, गैर-संवादात्मक लॉगिन गोले संभव हैं

$ head -1 /etc/profile
echo PROFILE BEING READ

$ echo echo hello | su -
PROFILE BEING READ
stdin: is not a tty
hello

$

यह इस सरलीकृत के समान है su -c 'echo hello' -:। जो, यह परखने के लिए कि हमें क्या चाहिए, su -c 'echo $0 $-; shopt -p login_shell' -इस रूप में लिखा जाना चाहिए: इस पुष्टिकृत उत्तर को प्राप्त करने के लिए (C कोट्स में एन्कोडेड) $'/etc/profile read \n -su hBc \n shopt -s login_shell':। यह पुष्टि करता है कि लॉगिन गैर-संवादात्मक शेल का मूल्यांकन किया गया था और इस प्रक्रिया में, / etc / प्रोफ़ाइल को पढ़ा गया था। धन्यवाद।

0

क्या एक गैर-संवादात्मक लॉगिन शेल (जिसे - एल्गिन या -एल के साथ नहीं कहा जाता है) होना संभव है?

हाँ।

$ (exec -a '-' bash -c 'shopt -q login_shell && echo login shell')

हालाँकि, ध्यान दें कि /etc/profileजब तक --loginतर्क नहीं दिया जाता है , तब तक एक गैर-इंटरेक्टिव लॉगिन शेल के लिए उपयोग नहीं किया जाएगा ।

एक सामान्य मुहावरा जो एक गैर-संवादात्मक लॉगिन शेल को आमंत्रित करता है:

$ su - someuser -c somecommand

लेकिन यह इस तथ्य से ग्रस्त है कि /etc/profileनिष्पादित नहीं होता है।

इस व्यवहार को बदलना संभव है, लेकिन इसमें config-top.h में पाए गए विकल्प को अनइंस्टॉल करके संकलन-समय पर बैश सोर्स कोड को कस्टमाइज़ करना शामिल है :

/* Define this to make non-interactive shells begun with argv[0][0] == '-'
run the startup files when not in posix mode. */
/* #define NON_INTERACTIVE_LOGIN_SHELLS */

जब मैंने इस suविसंगति पर शोध किया , तो मैंने पाया कि इसमें अन्य गोले भी शामिल हैं zshऔर इनमें dashविसंगति नहीं है।

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