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


मैं पाने की कोशिश कर रहा हूँ 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

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


77
2017-08-05 14:40


मूल


स्थानीय कॉमांड आपके स्थानीय सिस्टम पर चलाया जाता है, रिमोट सिस्टम नहीं। - Steve Kehlet
यहाँ देखें superuser.com/a/124110/47962 - Nakilon


जवाब:


सीडी एक खोल बनाया गया है। स्थानीय कॉमांड को इस प्रकार निष्पादित किया गया है:

/bin/sh -c <localcommand>

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


18
2017-08-05 15:52



हां, बस इसका जिक्र करना चाहता था। आप डाल सकते हैं cd में आदेश ~/.bashrc इसके बजाय रिमोट सर्वर पर। - vdboor
यह परेशान करने वाला है। जैसा कि मैंने एक और टिप्पणी में उल्लेख किया है, सर्वर के पास कई होस्टनाम हैं और मैं अलग-अलग व्यवहार करना चाहता था जिस पर इस्तेमाल किया गया था। मुझे लगता है कि यह निर्धारित करना संभव नहीं है कि .bashrc से किस का उपयोग किया गया था? - Gareth
यह संभव है, शायद शायद सलाह नहीं है। एसएसएच को एक छोटी शेल स्क्रिप्ट या उपनाम के साथ बदलना जो मेजबान नाम को एक चर के रूप में निर्यात करने के लिए पास करता है (एक ला "ssh -t उपयोगकर्ता @ होस्ट 'निर्यात connhostname = होस्ट; bash --login'")। लेकिन आप वास्तव में बहुत अजीब क्षेत्र में जाना शुरू कर रहे हैं। शायद एक बेहतर सवाल यह है कि आप इस व्यवहार को क्यों चाहते हैं? - BMDan
वास्तव में यह ईमानदार होने का सौदा नहीं है। मैं बस उस परिस्थिति में हूं जहां मैं इस सर्वर में लॉग इन करता हूं, मैं सीधे दो निर्देशिकाओं में से एक तक जाता हूं (जिस होस्ट पर मैं उपयोग कर रहा हूं) - Gareth


यह काम:

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

निर्देशिका बनाने के लिए यदि यह अस्तित्व में नहीं है:

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

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


76
2017-12-21 21:29



यह मुझे एक बाश प्रॉम्प्ट के साथ सही स्थान पर समाप्त करता है। उत्तम! - Peter Ehrlich
यह मेरे लिए भी काम करता है लेकिन अगर मैं इसे एसएसआई कूद-होस्ट के साथ उपयोग करने का प्रयास करता हूं तो यह काम नहीं करता है। मुझे एक कनेक्शन बंद संदेश मिलता है। - Riccardo


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

39
2018-02-27 11:04



कुछ मशीनों पर आपको संलग्न करने की आवश्यकता हो सकती है cd /path/to/your/destination सेवा मेरे ~/.bashrc के बजाए ~/.bash_profile। नतीजा वही होना चाहिए। - Matthias
यह पूरी तरह से धन्यवाद करता है - क्या यह केवल मेरे उपयोगकर्ता आईडी तक ही सीमित है या यह अन्य उपयोगकर्ता लॉगिन को भी प्रभावित करेगा? - barry_allen
@BabyGroot अगर आप संशोधित करते हैं ~/.bash_profile या ~/.bashrc यह केवल वर्तमान उपयोगकर्ता को प्रभावित करेगा। - rubenvarela


मामले के लिए अधिक मजबूत समाधान जब आपको 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 में निर्दिष्ट कॉन्फ़िगरेशन फ़ाइल के साथ। यह वांछित डीआईआर पर स्विच करने और डिफ़ॉल्ट को दबाने की अनुमति देता है .bashrc
  3. यह पूरा आदेश एक के रूप में लपेटा गया है alias, इसलिए एसएसएच क्लाइंट कमांड प्रॉम्प्ट पर इसे कहा जा सकता है ssh_myserver

5
2017-08-21 11:53



क्रिएटिव ... जब तक आपके पास लिखने की अनुमति है / tmp - smci


क्या आपने इस निर्देश को अपने एसएसएच कॉन्फ़िगरेशन में सक्षम किया है?

PermitLocalCommand yes

इसके लिए डिफ़ॉल्ट है no, जो मामले में आपका LocalCommand निर्देश को नजरअंदाज कर दिया जाएगा।

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


4
2017-08-05 14:47



वह निर्देश सेट है, हां (और मुझे लगता है कि अगर यह नहीं था तो मुझे त्रुटि संदेश दिखाई नहीं देगा)। .Bashrc का उपयोग करने में समस्या यह है कि सर्वर के पास अलग-अलग होस्ट नाम हैं, और मैं विभिन्न होस्ट नामों को विभिन्न प्रारंभिक निर्देशिकाओं में अनुवाद करना चाहता हूं - Gareth
जब तक प्रत्येक होस्ट नाम का कोई अलग आईपी पता न हो, तब तक सर्वर के लिए यह पता नहीं होगा कि आपने किस होस्ट नाम का अनुरोध किया था। जबकि HTTP अनुरोध एक दोस्ताना होस्ट प्रदान करते हैं: अनुरोधित होस्ट नाम की पहचान करने के लिए हेडर, एसएसएच कनेक्शन नहीं करते हैं। - Fosco


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

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

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

connect <foldername>

नोट: पथ चर बदलने के बाद आपको लॉग आउट और लॉग इन करने की आवश्यकता हो सकती है


4
2017-11-25 03:10



मैं इसे पिछले सुझाव के लिए पसंद करता हूं क्योंकि '$ SHELL' हमेशा वैध होता है, जबकि 'बैश' नहीं हो सकता है। 'Exec' का उपयोग भी एक अच्छा स्पर्श है। - Dave
एक और परिशोधन सुनिश्चित करना होगा कि 'सीडी' सफल है - "सीडी ~ / $ 1 && exec ... ' - Dave


आपके में ~/.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 आदेश जारी किए जाने से पहले कमांड निष्पादित किया जाता है और rc कमांड बाद में जारी किया जाता है, लेकिन खोल स्टार्टअप फ़ाइलों को पहले ही सोर्स किया जाता है। तो फिर, यह एक अलग खोल में हो रहा है।

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


3
2017-08-05 18:21





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


2
2017-08-05 15:03



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


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

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

0
2017-09-21 09:03