Ssh के साथ, आप बिना बाहर निकाले रिमोट मशीन पर कमांड कैसे चला सकते हैं?


29

आम तौर पर, यदि आप ऐसा करने के लिए एक आदेश पारित करते हैं

ssh me@example.com 'some-command.sh'

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

ssh me@example.com 'screen -r 12345'

लेकिन यह अनुमति नहीं है, त्रुटि को वापस करना "एक टर्मिनल से जुड़ा होना चाहिए।" जो मुझे लगता है कि अनिवार्य रूप से "एक इंटरैक्टिव शेल से इस कमांड को कॉल करना चाहिए" का मतलब है।

एक अन्य उदाहरण के रूप में, मैं एक टन मशीनों का उपयोग करता हूं, जिनके लिए मुझे कुछ चीजों को करने के अधिकारों के लिए साझा खाते का उपयोग करने की आवश्यकता होती है (हाँ, मुझे पता है: बुरा विचार लेकिन मुझे दोष न दें, मैंने चीजों को सेट नहीं किया है रास्ता), और वे आमतौर पर डिफ़ॉल्ट शेल के रूप में ksh होते हैं। मैं लॉग इन करना चाहता हूँ, bash (या zsh) पर स्विच करता हूँ, और अपने स्वयं के खाते को .bash_profile (या .zshrc) स्रोत करता हूँ। यह आसान होगा यदि मैं एक इंटरैक्टिव ssh सत्र स्थापित कर सकता हूं और लॉगिन पर चलाने के लिए रिमोट मशीन को कमांड दे सकता हूं ।

मेरे मन में एक बहुत ही क्लीवेज (और अनकहा) समाधान है जिसे मैं पोस्ट करूंगा, लेकिन मैं उम्मीद कर रहा हूं कि कोई बेहतर तरीका जानता है।

अद्यतन: जिन लोगों को यह महसूस नहीं हुआ, मैं हाथ से यह सब करने की योजना नहीं बना रहा हूं, इसलिए मुझे एक इंटरैक्टिव सत्र खोलने के लिए कह रहा हूं और फिर इसे हाथ से करने से वास्तव में कुछ भी हल नहीं होता है।

2 अद्यतन: स्पष्ट करने के लिए एक बार फिर प्रयास करने के लिए: मैं सर्वर पर (मनमाने ढंग से) कमांड चलाने की कोशिश कर रहा हूं (क्लाइंट पर निर्दिष्ट) लेकिन फिर एक इंटरैक्टिव सत्र खुला है जो उन प्रोग्राम कमांड द्वारा किए गए किसी भी चीज से प्रभावित होता है।


echo "command" | ssh user@remote_host
लैगिंगसर्प्लेक्स

2
क्या आपने सवाल के "बाहर निकलने के बिना" याद किया? मुझे पूरा यकीन है कि कमांड खत्म होने के बाद यह बाहर निकल जाएगा।
आइकनोकॉस्ट

जवाबों:


26

जब आप ssh कर सकते हैं, तो आप bash शुरू करने और अपनी स्वयं की प्रोफ़ाइल स्रोत बनाने के लिए निम्न आदेश आज़मा सकते हैं:

ssh  -t hostname "bash --rcfile ~user/.bashrc"

4
+1। -tस्विच के साथ प्रश्नकर्ता की समस्या का समाधान होता screenहै और साथ ही।
पैचेस

3
क्या यह कनेक्शन बंद किए बिना, मनमाने आदेशों के साथ उपयोग किया जा सकता है? यदि मैं कोशिश करता हूं ssh -t www.dev "echo 'hi there'", तो कमांड निष्पादित होने के बाद कनेक्शन तुरंत बंद हो जाता है।
आइकनोकॉस्ट

11

डॉगबैन के जवाब पर निर्माण, एक पूर्ण समाधान जैसा दिखता है:

ssh -t user@server 'cd /a/great/place; bash'

यहां मैं -tएक छद्म टर्मिनल के आवंटन को मजबूर करने के लिए उपयोग करता हूं , जो एक इंटरैक्टिव शेल के लिए आवश्यक है। फिर मैं सर्वर पर दो कमांड निष्पादित करता हूं: पहली बात यह है कि मैं इंटरेक्टिव शेल खोलने से पहले करना चाहता था (मेरे मामले में, एक विशिष्ट फ़ोल्डर में निर्देशिका बदलना), और फिर इंटरेक्टिव शेल खुद। बैश देखता है कि इसमें एक छद्म टर्मिनल है और अंतःक्रियात्मक रूप से प्रतिक्रिया करता है।

सिंगल कोट्स यह सुनिश्चित करते हैं कि आपके डिफॉल्ट शेल द्वारा चलाई जाने वाली कमांड के रूप में पूरी चीज़ रिमोट सर्वर को पास हो जाए।

फिर से आवश्यक सुराग प्रदान करने के लिए डॉगबैन के लिए धन्यवाद -t। मैं इस समस्या को हल करता था expect, जो निश्चित रूप से एक माउस को तोप से मार रहा था। (:


2

इस समाधान की कोशिश करो।

echo "command" | ssh user@remote_host

लॉगिन इंटरेक्टिव है और आपकी कमांड को पास किया जाता है जैसे कि आपने इसे इंटरेक्टिव कमांड लाइन पर टाइप किया है। सत्र समाप्त हो जाता है जैसे कि आपने टाइप किया था

ssh user@remote_host 'command'

3
यदि कमांड पूरा होने के बाद सत्र समाप्त हो जाता है, तो यह प्रश्न का उत्तर नहीं देता है । कमांड के पूरे बिंदु को कमांड निष्पादित होने के बाद एक इंटरैक्टिव सत्र के साथ छोड़ दिया जाना है, कि केवल सर्वर के माध्यम से कमांड भेजने के लिए ssh
आइकनोकॉस्ट

यह कम से कम अच्छा है कमांड के लिए एक इंटरव्यू का अनुकरण करने के लिए, -tअपने स्वयं के बैश फ़ाइल का उपयोग किए बिना । +1
लैगिंगसर्प्लेक्स

0

टर्मिअल सीएमडी का उपयोग करने के लिए ssh -X का उपयोग करें।

इसके अलावा - आप अपने cmds को "ssh 'सोर्स ~ / .bashrc && cd && do'" की तरह चेन कर सकते हैं।


लेकिन पूरी श्रृंखला हो जाने के बाद, मेरे पास एक संवादात्मक सत्र शेष नहीं है, है ना? यह अभी भी बंद है, है ना?
आइकनोकॉस्ट

और क्या आप टर्मियो समाधान पर विस्तार से ध्यान देंगे?
आइकनोकॉस्ट

0

रिमोट सिस्टम पर डिटैच क्यों न करें और उपयोग करें:

ssh -t user@example.com "/home/user/bin/detach ls"

क्या यह 'ls' चलेगा और मुझे एक इंटरैक्टिव सत्र के साथ छोड़ देगा? क्या होगा अगर, 'ls' के बजाय, मैं कुछ उपनाम और कार्य प्राप्त करने के लिए 'स्रोत .somefile' चलाता हूं। क्या वे मेरे संवादात्मक सत्र में उपलब्ध होंगे, या यह एक अलग सत्र के तहत चलाया जाएगा?
आइकनोकॉस्ट

नहीं, के कारण detach, lsसत्र खुला नहीं रखता है और आउटपुट को प्रिंट किए बिना डिस्कनेक्ट lsकर देगा , लेकिन यह अभी भी चलेगा।
दान डी।

मैं सर्वर पर (मनमाने ढंग से) कमांड चलाने की कोशिश कर रहा हूं (प्रोग्राम क्लाइंट पर निर्दिष्ट) लेकिन फिर एक इंटरैक्टिव सत्र खुला है जो उन प्रोग्राम कमांड द्वारा किए गए किसी भी चीज से प्रभावित होता है। इसलिए अगर मैं आपको सही तरीके से समझूं, तो इससे मुझे मदद नहीं मिलेगी।
आइकनोकॉस्ट

0

laggingreflex का उत्तर करीब है ... मैं इसे इस प्रकार बदलूंगा:

echo "command\n$(cat -)" | ssh user@remote_host

दुर्भाग्य से, आपको उस तरीके को पसंद करने की संभावना नहीं है जो काम करता है, 'कारण "बिल्ली" बफ़र करने के लिए लिखी पंक्तियों को बफ़र करता है ... यदि हम "इको-कैट" नामक एक स्क्रिप्ट बनाते हैं जो कुछ इस तरह दिखता है:

{
  echo "${@}"
 #cat buffers & won't flush to stdout immediately
 #cat -
  IFS='\n'
  while read line
  do
        echo "${line}"
  done
}

हम बिना बफरिंग के समान परिणाम प्राप्त करेंगे:

echo-cat "command" | ssh user@remote_host

कि शायद आप अपने उद्देश्य के लिए एक बहुत करीब मिल जाएगा ...


0

यह कीचड़ है, और निष्कलंक है, लेकिन मुझे लगता है कि यह काम करना चाहिए।

एक स्क्रिप्ट बनाएं (जैसे) रिमोट-स्टार्टर जो उपयोगकर्ता @ होस्ट तर्क के बाद एक उद्धृत तर्क लेता है:

remote-starter user@example.com 'some-command.sh arg1 arg2'

इस स्क्रिप्ट को पहले .onetimeरिमोट मशीन पर नामित (जैसे) फ़ाइल में उद्धृत कमांड (बिना उद्धरण के) को सहेजना चाहिए , और फिर नियमित ssh कमांड चलाएं, इस बार रिमोट मशीन पर चलाने के लिए कोई भी कमांड नहीं पारित करना चाहिए। (यदि स्क्रिप्ट के भीतर ssh user@example.com चल रहा है, तो यह ssh user@example.com को चलाने का काम कर सकता है।)

इस काम के लिए, रिमोट मशीन को .onetimeअपने .bash_profile या .zshrc या जो भी हो, से स्रोत होना चाहिए । दौड़ने के बाद .onetime, इसे हटा देना चाहिए .onetime, इसलिए फ़ाइल को नियमित रूप से लॉगिन करने के बाद अगली बार नहीं चलाना चाहिए ।

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