SSH रिमोट कमांड को कम पर्यावरण चर क्यों मिलता है, जब मैन्युअल रूप से चलाया जाता है? [बन्द है]


239

मेरे पास एक कमांड है जो ठीक चलता है अगर मैं एक मशीन के लिए ssh करता हूं और इसे चलाता हूं, लेकिन जब मैं दूरस्थ ssh कमांड का उपयोग करके इसे चलाने का प्रयास करता हूं तो वह विफल हो जाता है जैसे:

ssh user@IP <command>

विभिन्न वातावरणों में दोनों तरीकों के पुन: उपयोग से "एनवी" के आउटपुट की तुलना करना। जब मैं मैन्युअल रूप से मशीन में प्रवेश करता हूं और एनवी चलाता हूं, तो मुझे बहुत अधिक पर्यावरण चर मिलते हैं, जब मैं दौड़ता हूं:

ssh user@IP "env"

कोई विचार क्यों?


30
वास्तव में यह प्रश्न बंद विषय के रूप में क्यों है?
jottr

13
शायद इसलिए क्योंकि यह प्रोग्रामिंग से संबंधित नहीं है। इसे बंद करने के बजाय सुपर यूजर में ले जाना चाहिए था।
डैनियल एच

8
bashएक पटकथा भाषा नहीं है?
दान निसेनबूम

डेबियन 8 में मुझे किसी कारण से / आदि / पासवार्ड में बैश करने के लिए शेल को बदलना पड़ा। यहां तक ​​कि पुनरावर्तन करने के लिए / बिन / श बिंदु को भी मदद करने के लिए डैशफिश डैश को मदद नहीं मिली।
user1050755

जवाबों:


173

विभिन्न प्रकार के गोले हैं। SSH कमांड का निष्पादन शेल एक गैर-इंटरैक्टिव शेल है, जबकि आपका सामान्य शेल या तो एक लॉगिन शेल या एक इंटरैक्टिव शेल है। विवरण इस प्रकार है, मैन बैश से:

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

       एक इंटरैक्टिव शेल एक गैर-विकल्प के बिना शुरू किया गया है
       तर्क और बिना -c विकल्प के जिसका मानक इनपुट है
       और त्रुटि दोनों टर्मिनलों से जुड़ी हुई है (जैसा कि निर्धारित किया गया है
       isatty (3)), या एक -i विकल्प के साथ शुरू हुआ। PS1 है
       सेट और $ - इसमें i भी शामिल है यदि बैश इंटरैक्टिव है, तो अनुमति देता है
       इस राज्य का परीक्षण करने के लिए शेल स्क्रिप्ट या एक स्टार्टअप फ़ाइल।

       निम्नलिखित पैराग्राफों का वर्णन है कि बैश कैसे निष्पादित करता है
       स्टार्टअप फ़ाइलें। यदि कोई भी फाइल मौजूद है लेकिन नहीं हो सकती है
       पढ़ें, बैश एक त्रुटि की रिपोर्ट करता है। फाइल में टिल्ड्स का विस्तार किया जाता है
       Tilde विस्तार के तहत नीचे वर्णित नाम
       विस्तार अनुभाग।

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

       जब कोई लॉगिन शेल बाहर निकलता है, तो bash कमांड पढ़ता और निष्पादित करता है
       फ़ाइल से ~ / .bash_logout, यदि यह मौजूद है।

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

       जब शेल को चलाने के लिए गैर-अंतःक्रियात्मक रूप से बैश शुरू किया जाता है
       स्क्रिप्ट, उदाहरण के लिए, यह चर BASH_ENV में दिखता है
       पर्यावरण, अगर वहाँ दिखाई देता है, तो इसका मूल्य बढ़ाता है,
       और पढ़ने के लिए एक फ़ाइल के नाम के रूप में विस्तारित मूल्य का उपयोग करता है
       और निष्पादित करें। बैश ऐसा व्यवहार करता है जैसे कि निम्न आदेश
       निष्पादित किया गया:
              अगर [-n "$ BASH_ENV"]; फिर । "$ BASH_ENV"; फाई
       लेकिन PATH वैरिएबल का मान खोज करने के लिए उपयोग नहीं किया जाता है
       फ़ाइल नाम के लिए।


7
महान जवाब, यह वास्तव में समस्या थी, आवश्यक पर्यावरण चर / etc / bashrc में रहते थे, जो गैर संवादात्मक मोड में खट्टा नहीं है। उन्हें / etc / प्रोफाइल पर ले जाने से समस्या हल हो गई। आपका बहुत बहुत धन्यवाद!
टॉम फेनर

1
यह केवल एक आंशिक समाधान में उत्तर देता है। यहां कुछ और जानकारी दी गई है: एक अलग वातावरण चर (जैसे निर्यात SOURCED_SYSTEM_ETC_BASHRC) को विभिन्न फ़ाइलों में जोड़ें जो खट्टी हो जाती हैं: / etc / प्रोफ़ाइल, आदि / bashrc, ~ / .profile, ~ / .bash_profile, ~ / bashrc। फिर जेनकिंस आउटपुट में उस अद्वितीय चर की तलाश करें। मेरे मामले में, मैंने 'SOURCED_SYSTEM_ETC_BASHRC = हाँ' निर्यात करने के लिए / etc / bashrc को अद्यतन किया, और वह चर नोड के लिए जेनकिंस लॉग में दिखाई दिया। इसलिए मेरे मामले में, जेनकिंस दासों के लिए पर्यावरण चर सेट करने के लिए उन्हें / etc / bashrc में जाना होगा। जेनकिंस ssh लॉगइन केवल sourced / etc / bashrc।
कोडर रोडी

सुधार: मेरा मतलब था /etc/bash.bashrc, नहीं / etc / bashrc।
कोडर रोडी

37
यह पाठ की काफी दीवार है, मुझे लगता है कि यह हाइलाइटिंग के लायक ssh user@host "bash --login -c 'command arg1 ...'"होगा जो दूरस्थ शेल को लॉगिन वातावरण स्थापित करेगा। आपके द्वारा उद्धृत किया गया अनुभाग उल्लेख करता है --loginलेकिन इसे अनदेखा करना आसान होगा।
कोडबियर्ड

इस पोस्ट के लिए धन्यवाद, मैं ssh <ssh options> <IP> bash --login my_script.shरिमोट मशीन पर एक स्क्रिप्ट चलाता था, एक इलाज का काम करता था और मुझे स्थानीय एनवी JAVA_HOME
वर्सेस

117

कमांड चलाने से पहले प्रोफाइल की सोर्सिंग कैसे करें?

ssh user@host "source /etc/profile; /path/script.sh"

आपको यह बदलना सबसे अच्छा लग सकता है ~/.bash_profile, कि ~/.bashrc, या जो भी हो।

( यहाँ (linuxquestions.org) )


1
यह समस्या थी, इस समाधान ने बहुत काम किया।
सैम १५२

10
हमेशा स्रोत के लिए अतिरिक्त कोड टाइप करने से पर्यावरण हास्यास्पद होता है!
माइकल

4
कोई व्यक्ति शायद ही बार-बार इन प्रकार की चीजों को टाइप करता है, आम तौर पर यह एक स्क्रिप्ट के भीतर होता है, और इस तरह, कोई फर्क नहीं पड़ता कि "अतिरिक्त कोड" कितना है, जब तक यह काम करता है: tm:
इयान वॉन

1
अगर मैं दोनों / etc / प्रोफाइल और ~ / .bash_profile (पथ के लिए उपयोगकर्ता परिवर्धन प्राप्त करने के लिए) काम करता हूं, लेकिन यह बदसूरत है। "इंटरेक्टिव" लॉगिन का उपयोग करने और रिमोट मशीन पर पूर्ण उपयोगकर्ता-विशिष्ट पथ के साथ समाप्त करने के लिए कमांड (मेरे मामले में xterm) को बताने का एक आसान तरीका होना चाहिए?
जेस

ssh $ 1 "स्रोत ~ / .bashrc; ~ / temp_unix.sh" यहां temp_unix.sh का निर्यात MANI_HOME = "मणि डीपैक" है, लेकिन यह काम नहीं कर रहा है।
मणि गहरे

90

दूरस्थ ssh कमांड चलाते समय शेल वातावरण लोड नहीं होता है। आप ssh वातावरण फ़ाइल संपादित कर सकते हैं:

vi ~/.ssh/environment

इसका प्रारूप है:

VAR1=VALUE1
VAR2=VALUE2

इसके अलावा, विकल्प के sshdलिए कॉन्फ़िगरेशन की जांच करें PermitUserEnvironment=yes


1
पूर्णता! +100 अगर मैं कर सकता था :)
डेक्सटर

VisualGDB "bash: gcc: कमांड नहीं मिला" त्रुटि के साथ विफल हो रहा था और इस समाधान ने सुधार किया।
कालेंजी

बहुत खुबस। काश मैं इस साल के बारे में जानता था।
गुरुत्वाकर्षण

यह एकदम सही जवाब है!
जिरापॉन्ग

1
@ pg2455 जब आप हमेशा अपने सर्वर पर sshd को कॉन्फ़िगर करने में सक्षम नहीं होते हैं (या इसे सभी के लिए सक्षम नहीं करना चाहते हैं), आप अभी भी अपने उपयोगकर्ता वातावरण को संपादित कर सकते हैं
dpedro

63

मेरे पास भी ऐसा ही मुद्दा था, लेकिन अंत में मुझे पता चला कि ~ / .Bashrc मुझे सब चाहिए था।

हालाँकि, उबंटू में, मुझे उस लाइन पर टिप्पणी करनी थी, जो प्रसंस्करण बंद कर देती है ~ / .bashrc:

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

8
वैकल्पिक रूप से, आप अपने सभी "गैर-संवादात्मक" कोड को उस पंक्ति के ऊपर रख सकते हैं।
मशीनगॉस्ट

सुंदर, मुझे बहुत समय बचाया :) धन्यवाद
लांस पोलार्ड

धन्यवाद। बस यह जोड़कर कि रिटर्न स्टेटमेंट वाली फाइल को ढूंढा जा सकता है /etc/bash.bashrc
adarshr

क्या इस कोड को सर्वर में बिना बदले इसे बाईपास करना है?
योनी

मैंने इतना समय यह समझने में बिताया कि मेरी स्क्रिप्ट क्यों नहीं चली। किसने सोचा था कि इन लाइनों को .bashrc में डालना एक अच्छा विचार है ???
शार्क्सक्स

4

मैंने पाया कि इस मुद्दे के लिए एक आसान रिज़ॉल्यूशन स्क्रिप्ट के शीर्ष पर स्रोत / आदि / प्रोफ़ाइल को जोड़ना था। मैं फ़ाइल को लक्ष्य प्रणाली पर चलाने की कोशिश कर रहा था। यहाँ के सिस्टम पर, इसने पर्यावरण चर का निर्माण किया, जो कि script.sh द्वारा आवश्यक था जैसे कि लॉगिन शेल से चल रहा हो।

पूर्व प्रतिक्रियाओं में से एक में यह सुझाव दिया गया था कि ~ / .bashr_profile आदि ... का उपयोग किया जाए। मैंने इस पर अधिक समय नहीं दिया लेकिन, इसके साथ समस्या यह है कि यदि आप स्रोत प्रणाली पर शेल की तुलना में लक्ष्य प्रणाली पर एक अलग उपयोगकर्ता के लिए ssh करते हैं जिसमें से आप लॉग इन करते हैं तो मुझे यह दिखाई दिया कि यह स्रोत प्रणाली उपयोगकर्ता का कारण बनता है नाम ~ के लिए इस्तेमाल किया जाएगा।


उत्तम! समस्या का अच्छा एक-लाइन समाधान।
corpico

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