पूर्ण लॉगिन शेल के साथ रिमोट ssh कमांड चलाएँ


48

मैं कुछ करना चाहूंगा, ssh example.com 'ls'हालांकि प्रति ssh मैनपेज:

यदि कमांड निर्दिष्ट है, तो इसे लॉगिन शेल के बजाय रिमोट होस्ट पर निष्पादित किया जाता है।

तो क्या होता है कि lsयह प्रदर्शित होता है उत्पादन और फिर ssh बाहर निकलता है।

मैं यह पता नहीं लगा सकता कि पूर्ण लॉगिन शेल कैसे खुला है और फिर उस शेल के अंदर कमांड रन है। कमांड चलाने के बाद शेल को खुला छोड़ना। जैसे कि मैंने निम्नलिखित कार्य मैन्युअल रूप से किए थे:

  localhost$ ssh example.com 
example.com$ ls
             /folder1 
             /folder2 
example.com$ _

कोई विचार?


यह एक समान प्रश्न है superuser.com/questions/261617/…, लेकिन कोई भी उत्तर वास्तव में फिट नहीं लगता है कि मैं क्या करने की कोशिश कर रहा हूं।
मैथ्यू

कैसे के बारे में ssh example.com 'ls;bash'?
कैनिकोव्स

दूसरे शेल को इंटरएक्टिव बनाने के लिए आपको मेरे सिस्टम पर -i की आवश्यकता है।
फ्लेक्सो

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

@hornetbzz -t मुझे छद्म ट्टी देता है। लेकिन अन्यथा व्यवहार समान है। मैं एक इंटरेक्टिव शेल लॉन्च करना चाहता हूं, उस शेल के अंदर एक कमांड चलाएं और कमांड चलने के बाद शेल ओपन रहे।
मैथ्यू

जवाबों:


40

बस मार को निष्पादित करने के लिए lsऔर फिर एक लॉगिन शेल में बताएं

$ ssh user@host  -t 'bash -l -c "ls;bash"'

2
दुर्भाग्य से यह काम करते हुए नहीं दिखता है screen। अन्यथा ऐसा लगता है कि यह वही करता है जो मैं करने की कोशिश कर रहा था।
मैथ्यू

31
ssh user@host -t 'ls; exec $SHELL -l'

-tबल छद्म टर्मिनल आवंटन। इसका उपयोग रिमोट मशीन पर स्क्रीन पर आधारित कार्यक्रमों को निष्पादित करने के लिए किया जा सकता है। से थोड़ा अधिक उचित है bash -i

exec कोई नई प्रक्रिया नहीं बनाई जाती है।

-lउस क्रम में ~ / .bash_profile, ~ / .bash_login, और ~ / .profile दिखता है, और इससे आदेशों को पढ़ता और निष्पादित करता है ... इसके बिना आप शायद ~ / बिन निर्देशिका से स्क्रिप्ट / आदेश नहीं चला सकते, क्योंकि यह कोड ~ / से .फाइल को बिना -lझंडे के नहीं चलाया जाएगा :

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

@grawity @Alan यह वर्कअराउंड के रूप में काम कर सकता है, लेकिन मैं वास्तव में कमांड को शेल के अंदर चलाना पसंद करूंगा और कमांड चलाने के बाद नया शेल नहीं खोलूंगा।
मैथ्यू जूल

+1, -t निश्चित रूप से अति पर जाने का सही तरीका है, मैं इसके बारे में भूल गया।
फ्लेक्सो

@ मट्टू: आपको इसकी bashअनुमति देने के लिए अपने आप को पैच करना होगा ।
ग्रिटिटी

@ सच में नहीं, नीचे मेरा जवाब देखें
fons

@ मट्टू, का उपयोग करें exec bashयाexec $SHELL
यूजेन कोनकोव

1

फोंस के उत्तर पर अपनी टिप्पणी में, आप कहते हैं कि यह प्रयोग करते समय काम नहीं करता है screen

क्या आप इसे विस्तार से समझा सकते हैं? ओपनश के लिए सोर्स कोड को देखते हुए sshd कमांड को कॉल करके निष्पादित करता है

YOUR_DEFAULT_SHELL -c COMMAND

तो, उदाहरण के लिए, यदि आपके डिफ़ॉल्ट खोल है screen, तो यह सब है कि अच्छी तरह से काम नहीं करेगा क्योंकि screenके -cध्वज बस इसके ओवरराइड करता है .scrreenrc। इसलिए, यदि आपकी डिफ़ॉल्ट शेल है तो स्क्रीन पर कमांड भेजने का वास्तव में कोई तरीका नहीं है। आपको वास्तव में ssh को दिए गए कमांड के रूप में स्क्रीन को चलाना होगा, लेकिन एक डिफ़ॉल्ट शेल के साथ जो स्क्रीन नहीं है

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

ssh user@host -t 'screen bash -l -c "ls;bash"'

जिसे गहरी सांस लेनी चाहिए - मेजबान में ssh, स्क्रीन के कमांड के साथ bash -c चलाएं, जो एक नई विंडो बनाएगा। यदि यह विंडो सिर्फ ls खोलती है, तो यह समाप्त हो जाएगी, और स्क्रीन समाप्त हो जाएगी, इसलिए हम नए स्क्रीन विंडो के अंदर फोंस की ट्रिक का उपयोग करते हैं

मुझे लगता है कि यह काम करेगा, अगर यह भी आप क्या करने की कोशिश कर रहे थे;)


मुझे लगता screenहै कि इस स्थिति में मुझे जो समस्या है, वह यह है कि मैं इसे सामान्य रूप exec screen -RRसे अपने साथ लोड करता हूं .profile। इसका मतलब है कि bash -lस्क्रीन को लोड करने की कोशिश करता है जो इसके बाकी हिस्सों को फेंक देता है। ऐसा लगता है कि मैं तुम्हारा और @fons समाधान (तुम्हारा तो मुझे छोड़ देता है screen) दोनों में '-l' को हटाकर इसे प्राप्त कर सकता है । हालांकि यह एक प्रकार का बाज़ है।
मैथ्यू

0

एकाधिक-विकल्प विकल्प tty आवंटन को बाध्य करते हैं, भले ही ssh में कोई स्थानीय tty न हो:

ssh -tt user@host 'bash -l -c "/path/to/command'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.