`ssh <host>` एक लॉगिन शेल है, लेकिन `ssh <होस्ट> <कमांड>` नहीं है?


12

मैंने देखा है कि जब मैं ssh <host> <command>सिंटैक्स का उपयोग करके सीधे SSH होस्ट पर कमांड चलाता हूं , तो मैं आउटपुट को देखता हूं, .bashrcलेकिन .bash_profile(या .profile) के आउटपुट को नहीं ।

उदाहरण के लिए, यदि मैं दोनों फाइलों के शीर्ष पर निम्न कमांड रखता हूं,

echo ${BASH_SOURCE[0]}

और मैन्युअल स्रोत .bash_profile(जो स्रोत .bashrcबदले में), मैं देखूंगा

$ . .bash_profile
.bash_profile
.bashrc

यह वही आउटपुट है जिसे मैं ssh <host>कमांड के रूप में उपयोग करके एसएसएच के माध्यम से दूरस्थ रूप से इस कंप्यूटर में लॉग इन करता हूं । (और अगर मैं .bash_profileकहीं और अस्थायी रूप से स्टोव करता हूं , तो इनमें से कोई भी रेखा नहीं मिलती है।)

हालांकि, अगर मैं के साथ रिमोट मशीन पर सीधे एक आदेश पर अमल ssh <host> <command>के रूप sshमें, इस तरह तो उत्पादन दिखता है:

$ ssh <host> echo foo
/home/rlue/.bashrc
foo

मैं समझता हूँ कि बीच का अंतर है .bash_profileऔर .bashrcयह है कि पूर्व के लिए है लॉगिन गोले जबकि बाद के लिए है इंटरैक्टिव, गैर लॉगिन गोले

मैंने निम्नलिखित निष्कर्ष निकाला है:

  1. ssh <host>केवल स्रोत .bash_profile, जबकि
  2. ssh <host> <command>स्रोत केवल .bashrc, जिसका अर्थ है
  3. पूर्व एक लॉगिन शेल है और बाद वाला नहीं है।

क्या ये निष्कर्ष सही हैं? ssh <host> <command>एक इंटरैक्टिव, गैर-लॉगिन शेल के रूप में क्यों माना जाता है? क्या SSH अभी भी कमांड को निष्पादित करने के लिए रिमोट मशीन में प्रवेश नहीं कर रहा है?


का उत्पादन .bashrc? वह फ़ाइल किसी भी आउटपुट का उत्पादन करने वाली नहीं है। से किसी भी आउटपुट .bashrcssh का उपयोग कर सभी उपकरणों को उनके परिवहन के रूप में तोड़ सकता है।
कास्परड

काफी उचित। इस स्थिति में, कुछ पंक्तियाँ .bashrcएक त्रुटि फेंक रही थीं, जबकि समान रेखाएँ .bash_profileनहीं थीं। मैंने आपत्तिजनक लाइनों को ठीक करने से पहले विसंगति की जांच करने का अवसर लिया।
रयान ल्यू

जवाबों:


12

ओपनएसएसएच (सबसे अधिक संभावना है कि आप जो चला रहे हैं) यह तय करता है कि लॉगिन शेल बनाने के लिए या नहीं, और यह केवल ऐसा करता है यदि आप एक विशिष्ट कमांड नहीं चला रहे हैं। से man ssh:

 If command is specified, it is executed on the remote host instead of a
 login shell.

तो यह ssh सर्वर के लिए एक कार्यान्वयन विकल्प है कि वह लॉगिन शेल बनाना चाहता है या नहीं, और यदि आप चलाने के लिए कमांड देते हैं, तो यह नहीं है।

जबकि sshएक लॉगिन प्रदर्शन करता है, अगर आप इसे एक कमांड और बाहर निकलने पर अमल कर रहे हैं, यह वास्तव में बहुत अधिक सिर्फ इतना है कि आदेश को चलाने के लिए की तुलना में यह एक लॉगिन वातावरण हो रही है एक खोल बनाने के समान है। ऐसा लगता है, यह देखते हुए, कि ओपनएसएसएच लिखने वाले लोगों ने इसे उस तरह का काम करने का फैसला किया।

वे कमांड को निष्पादित करने के लिए एक गैर-इंटरैक्टिव, गैर-लॉगिन शेल बनाते हैं, क्योंकि यह एक अन्य संदर्भ / शेल में कमांड चलाने की भावना है। आम तौर पर, हालांकि, गैर-इंटरैक्टिव गोले स्वचालित रूप से स्रोत नहीं होंगे ~/.bashrcजो स्पष्ट रूप से यहां हो रहा है। bashवास्तव में यहाँ हमारी मदद करने की कोशिश कर रहा है। से डॉक्स

दूरस्थ शैल डेमॉन द्वारा आमंत्रित किया गया

बैश यह निर्धारित करने का प्रयास करता है कि यह कब नेटवर्क कनेक्शन से जुड़े मानक इनपुट के साथ चलाया जा रहा है, जब दूरस्थ शेल डेमॉन द्वारा निष्पादित किया जाता है, आमतौर पर rshd, या सुरक्षित शेल डेमॉन sshd। यदि बैश यह निर्धारित करता है कि यह इस तरह से चलाया जा रहा है, तो यह ~ / .bashrc से कमांड पढ़ता है और निष्पादित करता है, यदि वह फाइल मौजूद है और पढ़ने योग्य है। यदि इसे श के रूप में आमंत्रित किया जाता है तो यह ऐसा नहीं करेगा। --Norc विकल्प का उपयोग इस व्यवहार को बाधित करने के लिए किया जा सकता है, और --rcfile विकल्प का उपयोग किसी अन्य फ़ाइल को पढ़ने के लिए बाध्य करने के लिए किया जा सकता है, लेकिन न तो rshd और sshd आमतौर पर उन विकल्पों के साथ शेल को लागू करते हैं या उन्हें निर्दिष्ट करने की अनुमति देते हैं।


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

@RyanLue गोले के अलग-अलग "स्वाद" प्रत्येक कार्य को कुछ आसान / अधिक सुरक्षित / अनुकूलित करते हैं आदि जबकि sshएक लॉगिन करने की आवश्यकता होती है, कार्यान्वयनकर्ताओं ने स्पष्ट रूप से निर्णय लिया कि कुछ परिस्थितियों में, उदाहरण के लिए, इसे एक कमांड निष्पादित करने और वापस करने के लिए कहें, लॉगिन शेल लेने वाले अतिरिक्त चरणों से ज़रूरत नहीं है / लाभ होता है, और इसलिए वे इसे छोड़ देते हैं। तो वास्तव में एक शेल है जो चलाया जाता है, मैं ज्यादातर पर्यावरण को सेटअप करने के लिए मानता हूं, और चूंकि शेल उस उपयोगकर्ता को प्रदान नहीं किया जा रहा है जो लॉग इन करते हैं, वे इसका इलाज करते हैं जैसे कि उपयोगकर्ता ने चलाने के लिए एक नया शेल शुरू किया था कमान
एरिक रेनॉफ

"तो वास्तव में एक शेल है जो चलाया जाता है, मैं ज्यादातर पर्यावरण को सेटअप करने के लिए मानता हूं ..." <लेकिन मैंने अभी इसके साथ प्रयोग किया है, और ऐसा प्रतीत होता है कि ssh <host> <command>किसी भी मौजूदा लॉगिन शेल के वातावरण को विरासत में नहीं मिला है। उदाहरण के लिए, बिना सोर्सिंग के (या , जैसा भी हो) $ ssh <host> \$PATHपथ को वापस लौटा देता है ... व्यावहारिक अर्थ में, आप उस कदम को दरकिनार क्यों करना चाहेंगे? .bash_profile.profile
रयान ल्यू

", कार्यान्वयनकर्ताओं ने स्पष्ट रूप से निर्णय लिया कि कुछ परिस्थितियों में, उदाहरण के लिए, इसे एक कमांड निष्पादित करने और वापस लौटने के लिए, एक लॉगिन शेल लेने वाले अतिरिक्त कदमों की आवश्यकता / लाभ नहीं है, और इसलिए वे इसे छोड़ देते हैं।" <, विशेष रूप से इस डिजाइन विकल्प पर स्पष्टीकरण / अंतर्दृष्टि की तलाश में। मैं अपने को परिभाषित PATHमें .profile- वास्तव में बात यह है कि आपको किस तरह की एक दूरस्थ होस्ट पर एक मनमाना आदेश चलाने से पहले लोड चाहते हैं कि नहीं कर रहा है करना चाहते हैं?
रयान ल्यू

1
@ बियान ssh सर्वर ssh के अलग-अलग उपयोगों को अलग करता है और प्रत्येक के लिए अनुमति दे सकता है। रिमोट लॉगिन, रिमोट निष्पादन, रिमोट कॉपी, शायद यह समझने में मदद करता है कि आपके द्वारा वर्णित व्यवहार क्यों होगा। उच्च सुरक्षा वातावरण में दूरस्थ लॉगिन (इंटरेक्टिव उपयोग) बहुत अधिक हो सकता है। Openssh को rbash / rksh और 'logout' में .bash_profile, orroot के उपयोग द्वारा प्रतिबंधित किया जा सकता है।
बबास्सिएई

4

इस व्यवहार का कारण गोले की तुलना में निचले स्तर पर है: ssh host("लॉगिन शेल" केस) दूरस्थ होस्ट पर एक छद्म सुथार का उपयोग करता है , sshdसर्वर प्रक्रिया और शेल के बीच संवाद करने के लिए ; इसके बजाय और के ssh host commandबीच पाइप का उपयोग करता है । स्यूडोटर्मिनल एक कमांड दुभाषिया का इंटरैक्टिव उपयोग करने के लिए आवश्यक हैं, जैसे कि एक शेल, या एक स्क्रिप्टिंग भाषा का " रीड-इवल-प्रिंट " मोड; वे मानव-अनुकूल सुविधाओं के एक समूह को लागू करते हैं, जैसे कि टाइपो पर बैकस्पेस करने में सक्षम। लेकिन उनके पास अधिक ओवरहेड है और (कॉन्फ़िगरेशन के आधार पर) अनियंत्रित डेटा को अनमॉडिफाइड से गुजरने की अनुमति नहीं देता है, इसलिए जब बातचीत नहीं हो रही है तो एसएसएच उनका उपयोग करने से बचता है।sshdcommand

कभी-कभी SSH की कमांड / नो कमांड हेयुरिस्टिक को यह गलत लगता है; इसे स्विच -tऔर -Tस्विच के साथ ओवरराइड किया जा सकता है । उदाहरण के लिए, एक दूरस्थ मशीन में प्रवेश करने और एक निलंबित screenसत्र को तुरंत रिटेट करने के लिए, आपको करने की आवश्यकता है ssh -t host screen -R; एक टर्मिनल से जुड़े नहीं होने के बारे में शिकायत करने ssh host screen -Rका कारण होगा screen। मैं ऐसी स्थिति के बारे में नहीं सोच सकता जब आप वास्तव में उपयोग करना चाहते हों-T , लेकिन यह तब होता है जब आप कभी भी ऐसा करते हैं।


1

पहले आपको विभिन्न प्रकारों को देखने की जरूरत है, आप इसे पढ़ सकते हैं:

/unix/170493/login-non-login-and-interactive-non-interactive-shells

अब अगर आप अपना bashrc खोलते हैं तो आप इसे शुरुआत में देखने वाले हैं:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

इसका मतलब है कि आप इस सिस्टम तक कैसे पहुंच रहे हैं, इस पर निर्भर करता है कि यह कोड कोड को अंदर लोड करता है या नहीं।


ठीक है, लेकिन यह एक दिलचस्प सवाल उठाता है: .bashrcयदि यह एक गैर-संवादात्मक संदर्भ में कहा जाता है, तो इसका मतलब यह नहीं लिखा जा सकता है ( जैसे कि, यदि "शीघ्र कथन" / $PS1चर नहीं है)। लेकिन ssh <host> <command> निश्चित रूप से गैर-इंटरैक्टिव है ; अर्थात् , यह कमांड प्रॉम्प्ट नहीं बढ़ाता है। तो क्यों OpenSSH .bashrcइस प्रतीत होता है लॉगिन, गैर-इंटरैक्टिव उपयोग के मामले के लिए एक गैर-लॉगिन, इंटरैक्टिव प्रॉम्प्ट (जो स्रोत के लिए कोशिश करता है ) बनाने के लिए डिज़ाइन किया जाएगा ??
रयान ल्यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.