मैं स्वचालित रूप से ssh लॉगिन पर निर्देशिका कैसे बदल सकता हूं?


87

sshजब मैं लॉग इन करता हूं तो मैं एक विशेष निर्देशिका में स्वचालित रूप से बदलने की कोशिश कर रहा हूं । मैंने निम्नलिखित निर्देशों का उपयोग करते हुए उस व्यवहार को प्राप्त करने की कोशिश की है ~/.ssh/config:

Host example.net
LocalCommand "cd web"

लेकिन जब भी मैं लॉग इन करता हूं, मैं निम्नलिखित देखता हूं:

/bin/bash: cd web: No such file or directory

हालांकि webमेरे होम डायरेक्टरी में एक फोल्डर जरूर है । निरपेक्ष मार्ग का उपयोग करने पर भी यही संदेश मिलता है। स्पष्ट होने के लिए, यदि मैं cd webलॉग इन करने के बाद टाइप करता हूं तो मैं सही फ़ोल्डर में पहुंच जाता हूं।

मुझे यहां क्या समझ नहीं आ रहा है?

संपादित करें:

उद्धरण / निरपेक्ष पथ के विभिन्न संयोजन अलग त्रुटि संदेश देते हैं:

LocalCommand "cd web"
/bin/bash: cd web: No such file or directory

LocalCommand cd web
/bin/bash: line 0: cd: web: No such file or directory

LocalCommand cd /home/gareth/web
/bin/bash: line 0: cd: /home/gareth/web: Input/output error

इससे मुझे लगता है कि उद्धरण नहीं होना चाहिए, और यह एक और त्रुटि हो रही है।


9
LocalCommand आपके स्थानीय सिस्टम पर चलाया जाता है, रिमोट सिस्टम से नहीं।
स्टीव केलेट

यहाँ देखें सुपरसर्वर
124110

जवाबों:


25

सीडी एक शेल बिल्डिन है। LocalCommand के रूप में निष्पादित किया जाता है:

/bin/sh -c <localcommand>

जो आप करना चाहते हैं वह वास्तव में SSH के माध्यम से पूरा नहीं किया जा सकता है; आपको किसी तरह से शेल को संशोधित करने की आवश्यकता है, जैसे bashrc / bash_profile के माध्यम से।

<लगभग एक दशक बाद संपादन ...>

LocalCommandवैसे भी आप क्या चाहते हैं। जो आपकी मशीन पर चलता है । आप चाहते हैं RemoteCommand। कुछ इस तरह से मेरे लिए काम किया:

Host example.net
  RemoteCommand cd / && exec bash --login
  RequestTTY yes

1
हां, बस उसी का उल्लेख करना चाहता था। आप इसके बजाय रिमोट सर्वर पर cdकमांड डाल सकते हैं ~/.bashrc
vdboor 16

यह परेशान करने वाला है। जैसा कि मैंने एक अन्य टिप्पणी में उल्लेख किया है, सर्वर में कई होस्टनाम हैं और मैं अलग-अलग व्यवहार करना चाहता था जिसके आधार पर इसका उपयोग किया गया था। मुझे लगता है कि यह निर्धारित करना संभव नहीं है जो .bashrc से उपयोग किया गया था?
गारेथ

यह संभव है, बस उचित नहीं है। एक छोटे शेल स्क्रिप्ट या उर्फ ​​के साथ ssh की जगह कुछ ऐसा है जो होस्ट नाम को निर्यात किए जाने वाले चर के रूप में पारित करता है (एक ला "ssh -t user @ host 'Export connhostname = host; bash --login'")। लेकिन आप वास्तव में बहुत ही अजीब क्षेत्र में जाने लगे हैं। शायद एक बेहतर सवाल यह है कि आप इस व्यवहार को क्यों चाहते हैं?
BMDAN

यह सच है कि ईमानदार होना कोई बड़ी बात नहीं है। मैं अभी उस स्थिति में हूं, जहां मैं इस सर्वर में लॉग इन करने के लिए अधिकांश समय सीधे दो निर्देशिकाओं में से एक पर जाता हूं (इस पर निर्भर करता है कि मैं किस मेजबान का उपयोग कर रहा हूं)
गैरेथ

77

यह काम:

ssh server -t "cd /my/remote/directory; bash --login"

एक निर्देशिका बनाने के लिए अगर यह मौजूद नहीं है:

ssh server -t "mkdir -p newfolder; cd ~/newfolder; pwd; bash --login"

यदि आप bashपथ के अंत में नहीं cdजुड़ते हैं तो आप कॉमन रन के बाद बाहर निकल जाते हैं । और यदि आप नहीं जोड़ते हैं --loginतो आपका ~/.profileस्रोत खट्टा नहीं है।


यह मुझे सही स्थान पर बैश प्रॉम्प्ट के साथ समाप्त करता है। उत्तम!
पीटर एर्लिच

यह मेरे लिए भी काम करता है, लेकिन अगर मैं इसे ssh जंप-होस्ट के साथ उपयोग करने की कोशिश करता हूं तो यह काम नहीं करता है। मुझे एक कनेक्शन बंद संदेश मिलता है।
रिकार्डो

43
  1. अपने बॉक्स में लॉगिन करें
  2. संपादित करें ~/.bash_profile
  3. फ़ाइल जोड़ने के अंत में cd /path/to/your/destination
  4. इसे सहेजें और बाहर निकलें
  5. बॉक्स से लॉगआउट करें
  6. फिर से लॉगिन करें और आपको लैंड करना चाहिए /path/to/your/destination

3
कुछ मशीनों पर आपको इसके बजाय संलग्न cd /path/to/your/destinationकरने की आवश्यकता हो सकती ~/.bashrcहै ~/.bash_profile। परिणाम वही होना चाहिए।
माथियास

यह पूरी तरह से धन्यवाद काम करता है - क्या यह केवल मेरी उपयोगकर्ता आईडी तक ही सीमित है या क्या यह अन्य उपयोगकर्ता लॉगिन को भी प्रभावित करेगा?
hard_working_ant

@BabyGroot आप संशोधित करता है, तो ~/.bash_profileया ~/.bashrcयह केवल वर्तमान उपयोगकर्ता को प्रभावित करेगा।
रुबनेवारेला

5

मामले के लिए अधिक मजबूत समाधान जब आपको ssh और डिफ़ॉल्ट .bashrc फ़ाइल को ओवरराइड करने की आवश्यकता होती है। यह उन मामलों में उपयोगी होता है जब दूरस्थ सर्वर वातावरण में कई डॉकरोट होते हैं और कई उपयोगकर्ताओं द्वारा उपयोग किए जाते हैं।

alias ssh_myserver='ssh server_name -t "echo cd /path/to/desired/dir>/tmp/.bashrc_tmp; bash --rcfile /tmp/.bashrc_tmp"'

और जानकारी:

  1. पहले कमांड किसी सामग्री के साथ दूरस्थ सर्वर पर निर्देशिका .bashrc_tmpमें फ़ाइल बनाता /tmpहैcd /path/to/dir
  2. अगला कमांड bashचरण 1 में निर्दिष्ट कॉन्फ़िगरेशन फ़ाइल के साथ निष्पादित होता है। यह वांछित dir पर स्विच करने और डिफ़ॉल्ट को दबाने की अनुमति देता है .bashrc
  3. इस पूरे कमांड को एक के रूप में लपेटा गया है alias, इसलिए ssh क्लाइंट कमांड प्रॉम्प्ट पर इसे कहा जा सकता हैssh_myserver

क्रिएटिव ... जब तक आपने
smci

4

क्या आपने अपने ssh config में यह निर्देश सक्षम किया है?

PermitLocalCommand yes

उसके लिए डिफ़ॉल्ट, उस noस्थिति में आपके LocalCommandनिर्देश की अनदेखी की जाएगी।

वैकल्पिक रूप से, क्या आपने अपनी .bashrcफ़ाइल में कमांड जोड़ने की कोशिश की है ?


यह निर्देश सेट है, हाँ (और मुझे लगता है कि मैं त्रुटि संदेश नहीं दिखाऊंगा यदि यह नहीं था)। .Bashrc का उपयोग करने के साथ समस्या यह है कि सर्वर के अलग-अलग होस्ट नाम हैं, और मैं अलग होस्ट नाम अलग-अलग शुरुआती निर्देशिकाओं में अनुवाद करना चाहता हूं
Gareth

जब तक प्रत्येक होस्ट नाम का एक अलग IP पता नहीं होता, तब तक सर्वर के लिए यह जानने का कोई तरीका नहीं होगा कि आपने कौन सा होस्ट नाम अनुरोध किया था। जबकि HTTP अनुरोध एक अनुकूल होस्ट प्रदान करता है: अनुरोधित होस्ट नाम की पहचान करने के लिए हेडर, SSH कनेक्शन नहीं।
फोसको

4

इसलिए मैंने बहुत सारी वेबसाइट (स्टैकओवरफ्लो, इस एक) को खोजा है लेकिन मुझे जो चाहिए था वह नहीं मिला। मैंने अपनी शेल स्क्रिप्ट बनाई। मैं इसे यहाँ पेस्ट कर रहा हूँ। इसके अलावा, आप इसे $ PATH में एक निर्देशिका की प्रतिलिपि बना सकते हैं।

#!/bin/bash
ssh -t <username@hostname> "cd ~/$1; exec \$SHELL --login"

तो इसके बाद। मैं करता हूँ:

connect <foldername>

नोट: आपको पथ चर को बदलने के बाद लॉग आउट और लॉग इन करना पड़ सकता है


मैं इसे पिछले सुझाव के लिए पसंद करता हूं क्योंकि '$ SHELL' हमेशा मान्य होता है, जबकि 'bash' नहीं हो सकता है। इसके अलावा 'एक्ज़ीक्यूट' का उपयोग एक अच्छा स्पर्श है।
डेव

एक और शोधन सुनिश्चित करने के लिए 'सीडी' सफल है - "सीडी ~ / $ 1 && निष्पादन ... '
डेव

3

अपने में ~/.ssh/config:

LocalCommand echo '/home/%r/some/subdir' > /home/%r/.ssh/ssh_cd

आपके अंत में ~/.bashrc:

if [[ -f $HOME/.ssh/ssh_cd ]]
then
    cd $(<$HOME/.ssh/ssh_cd)
    # uncomment the line below and the file will be removed so the cd won't work
    # unless the file is regenerated since you may not want this to operate for
    # non-ssh logins or for ssh logins that you want to function differently
    # rm $HOME/.ssh/ssh_cd
fi

मैंने एक्सपोर्टेड वैरिएबल सहित वेरिएबल पासिंग का उपयोग करते हुए ऐसा करने की कोशिश की, लेकिन ये कमांड अलग-अलग गोले में चलते हैं।

जब आप परीक्षण करने की कोशिश कर रहे थे, तो मुझे एक त्रुटि नहीं मिली जब मैंने रास्ते में बिना निरपेक्ष पथ का उपयोग किया। मैंने ; pwdकमांड के अंत में जोड़ा और सही निर्देशिका प्रदर्शित की गई है, हालांकि मैं जिस निर्देशिका को समाप्त करता हूं ~cdमेरे शेल स्टार्टअप फ़ाइलों में कोई कमांड नहीं हैं । मैं एक अलग डालने की कोशिश की cd somedir; pwdमें ~/.ssh/rc(जगह में अभी भी अन्य के साथ)। configपहले motd जारी किया जाता है आदेश निष्पादित किया जाता है और rcआदेश बाद में जारी किया जाता है, लेकिन खोल से पहले स्टार्टअप फ़ाइलों sourced रहे हैं। तो फिर, यह एक अलग शेल में हो रहा है।

पास-बाय-फाइल तकनीक का प्रयास करें और मुझे बताएं कि क्या यह आपके लिए काम करता है।


2

क्या आपने इसके आसपास के उद्धरणों के बिना इसे आज़माया है? एकमात्र उदाहरण मैंने देखा है कि उनके पास ऐसा नहीं है क्योंकि उनके साथ यह कमांड के रूप में सीडी \ वेब को निष्पादित करने की कोशिश कर सकता है।


ठीक है, उद्धरण हटाने से मदद मिलती है लेकिन मुझे अभी भी त्रुटियाँ हैं (संपादित पोस्ट देखें)
गैरेथ

1

आप यह भी कोशिश कर सकते हैं, विकल्प के साथ -t:

ssh server -t "cd /my/remote/directory; bash"

1

RemoteCommandइसके बजाय प्रयोग करने की कोशिश करें , जैसे

Host myhost
  HostName IP
  User ubuntu
  IdentityFile ~/.ssh/id_rsa
  RemoteCommand cd web; $SHELL -il

RemoteCommand: सर्वर से सफलतापूर्वक कनेक्ट होने के बाद रिमोट मशीन पर निष्पादित करने के लिए एक कमांड निर्दिष्ट करता है। ( man ssh_config)

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