ssh, एक विशिष्ट शेल शुरू करें, और रिमोट मशीन पर एक कमांड चलाएं?


11

मैं ऐसी स्थिति में हूं, जहां कई उपयोगकर्ता एक ही उपयोगकर्ता खाते को दूरस्थ मशीन पर साझा कर रहे हैं। मेरे पास एक "व्यक्तिगत" निर्देशिका है जहाँ मैंने अपनी .zshrcफ़ाइल लिखी है , और मैं इसका एक तरीका लेना चाहूंगा:

  1. मेरी ssh config फाइल (जैसे ControlMaster auto) से निर्देशों के साथ रिमोट मशीन में ssh सत्र शुरू करें
  2. यह सत्र एक Z खोल चलाता है
  3. यह .zshrcमेरी "व्यक्तिगत" निर्देशिका में है (साझा उपयोगकर्ता के होम निर्देशिका पर नहीं)

इस तरह के ssh सत्र शुरू करने के लिए एक उपनाम या सरल तरीका होना अच्छा होगा (इसीलिए मैंने OpenSSH की कॉन्फिग फ़ाइल का उपयोग करने के बारे में सोचा था), लेकिन मैं किसी भी अन्य विचारों के लिए खुला हूँ!

OpenSSH की कॉन्फिग फ़ाइल का उपयोग करना?

मैंने ओपनएसएसएच के ssh_config मैन पेज पर पढ़ा कि मैं सर्वर को सफलतापूर्वक कनेक्ट करने के बाद स्थानीय रूपLocalCommand से चलाने के लिए एक कमांड निर्दिष्ट करने के निर्देश का उपयोग कर सकता हूं । इससे मुझे लगा कि सर्वर से कनेक्ट होने के बाद दूरस्थ रूप से चलाने के लिए फ़ाइल को बताने का एक तरीका हो सकता है , लेकिन ऐसा प्रतीत नहीं होता है।config


मुझे नहीं लगता कि आप कर सकते हैं। लेकिन मैं हैरान हूं कि आप ऐसा क्यों चाहते हैं। पहले से ही ssh कमांड लाइन पर एक कमांड है। तुम क्यों नहीं दौड़ सकते ssh mycommand? और यदि आप ssh पर आने वाले हर कमांड से पहले कुछ सेटअप कमांड चलाना चाहते हैं, तो सर्वर साइड को कॉन्फ़िगर क्यों नहीं करें?
गिल्स एसओ- बुराई को रोकना '

धन्यवाद @Guilles मैं ऐसी स्थिति में हूं जहां कई उपयोगकर्ता एक ही दूरस्थ खाते को साझा कर रहे हैं, इसलिए मैं कुछ चीजें जल्दी से सेट करना चाहूंगा जैसे कि मैं दूरस्थ रूप से लॉग इन करता हूं। विशेष रूप से, मैं एक Z खोल शुरू करना चाहता हूं और इसे .zshrcएक विशिष्ट निर्देशिका (यानी "व्यक्तिगत" होम निर्देशिका) में चलाने के लिए कहता हूं । मैंने कोशिश की, ssh -t host_name 'zsh & source /path/to/my_zshrc'लेकिन यह काम नहीं किया (मुझे मिल गया FPATH variable not defined, और मुझे लगता है कि यह इसलिए है क्योंकि zshइससे पहले कि यह खत्म हो जाए my_zshrc, अकेले चलो यह मुझे एक Z खोल नहीं देता)
Amelio Vazquez-Reina

मुझे लगता है कि यह ओपी का एक अपडेट है, इसलिए मैंने इसे अपडेट किया।
एमेलियो वाज़केज़-रीना

मेरे इसी तरह के जवाब की तलाश में जाने के बाद, यह मेरे लिए होता है कि यह सवाल आपके करीबी के लिए बहुत करीब है।
गिल्स एसओ- बुराई को रोकें '

जवाबों:


15

दूरस्थ रूप से कमांड चलाने का सबसे स्पष्ट तरीका यह है कि आप इसे ssh कमांड लाइन पर निर्दिष्ट करें। Ssh कमांड की व्याख्या हमेशा दूरस्थ उपयोगकर्ता के शेल द्वारा की जाती है।

ssh bob@example.com '. ~/.profile; command_that_needs_environment_variables'
ssh -t bob@example.com '. ~/.profile; exec zsh'

साझा खाते आमतौर पर एक बुरा विचार हैं; यदि संभव हो तो, हर उपयोगकर्ता के लिए अलग खाते प्राप्त करें। यदि आप एक साझा खाते के साथ फंस गए हैं, तो आप एक उपनाम बना सकते हैं:

ssh -t shared-account@example.com 'HOME=~/bob; . ~/.profile; exec zsh'

यदि आप सार्वजनिक कुंजी प्रमाणीकरण (फिर से अनुशंसित) का उपयोग करते हैं, तो आप प्रति-कुंजी आदेशों को परिभाषित कर सकते हैं ~/.ssh/authorized_keys। अधिक स्पष्टीकरण के लिए यह उत्तर देखें । ~/.ssh/authorized_keysसर्वर पर अपनी कुंजी के लिए लाइन संपादित करें (सभी एक लाइन पर):

command="HOME=$HOME/bob;
     if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
       eval \"$SSH_ORIGINAL_COMMAND\";
     else exec \"$SHELL\"; fi" ssh-rsa AAAA…== bob@some.where

शानदार @Guilles। इस साइट के लिए आपका योगदान इसे हम सभी के लिए एक जबरदस्त उपयोगी संसाधन बना रहा है। बहुत बहुत धन्यवाद, वास्तव में। वैसे, मुझे execकमांड के बारे में पता नहीं था । सीधे exec zshकॉल zshकरने से अलग कैसे है ? इस विशेष मामले में यह महत्वपूर्ण क्यों है?
अमेलियो वाज़केज़-रीना

हम्म, जब मैं दौड़ता ssh -t shared-account@example.com 'HOME=~/bob; exec zsh'हूं तो मुझे मिलता है HOME=~/bob: command not found। मुझे लगता है कि मैं पर हूं tcsh। अगर मैं कोशिश करता हूं तो मुझे वही समस्या होती है HOME=/home/bob। मैंने बैश और ज़श पर कोशिश की। किसी भी सुराग क्या यह कारण हो सकता है? अंत में, उपर्युक्त वाक्यविन्यास मुझे ssh सत्र के साथ खुला छोड़ देगा? (मैं क्या चाहता हूँ)। एक बार फिर धन्यवाद।
एमिलियो वाज़केज़-रीना

1
@intrpc execमूल शेल को zsh से बदल देता है; बिना zsh, मूल शेल तब तक मेमोरी में बना रहेगा जब तक zsh बाहर नहीं निकलता और फिर बाहर निकल जाता है। मुख्य अंतर स्मृति की थोड़ी बचत है, यह बहुत महत्वपूर्ण नहीं है। यदि आपका लॉगिन शेल c (t) है, तो उपयोग करें setenv HOME ~/bob; exec zsh। अंत में, चूंकि zsh बिना किसी तर्क के शुरू किया गया है, इसलिए आपको एक शेल सत्र मिलता है, जैसे कि आप प्राप्त करेंगे यदि आपने अभी-अभी भाग लिया sshथा और आपके लॉगिन शेल के रूप में zsh था।
गिलेस एसओ- बुराई को रोकना '

आपकी सहायता के लिए एक बार फिर से धन्यवाद। एक यहाँ सवाल का पालन करें। कमांड के बाद अधिक कमांड चलाने का कोई तरीका exec zsh?
एमेलियो वाज़केज़-रीना

1
@ AmelioVazquez-Reina आसानी से नहीं जब तक आप डॉट फ़ाइलों में से एक पर कुछ नियंत्रण नहीं है। आप ZDOTDIRएक अलग निर्देशिका में डॉट फ़ाइलों के लिए zsh लुक बनाने के लिए पर्यावरण चर सेट कर सकते हैं । यदि आपका डॉट फ़ाइलों पर कुछ नियंत्रण है, तो आप पर्यावरण चर में निष्पादित करने के लिए कोड जोड़ने और पास eval $LC_STARTUP_CODEकरने जैसा कुछ कर सकते हैं । $ZDOTDIR/.zshrcLC_STARTUP_CODE
गाइल्स का SO- बुराई पर रोक '10

-3

सर्वर से कनेक्ट करने के बाद रिमोट से कमांड चलाने के लिए, अपने .ssh / config में निम्नलिखित स्निपेट फाइल करें

PermitLocalCommand yes

Host <server-ip-address>
    LocalCommand *command*

2
धन्यवाद @ user626129, लेकिन जैसा कि मैंने मूल प्रश्न में उल्लेख किया है कि LocalCommandनिर्देश स्थानीय शेल पर कमांड चलाना है , रिमोट शेल पर नहीं ।
एमिलियो वाज़केज़-रीना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.