मैं किसी विशेष निर्देशिका में सीधे कैसे ssh कर सकता हूं?


248

मुझे अक्सर कई सर्वरों में से एक में लॉगिन करना पड़ता है और उन मशीनों में कई निर्देशिकाओं में से एक पर जाना पड़ता है। वर्तमान में मैं इस प्रकार का कुछ करता हूं:

लोकलहोस्ट ~] $ ssh somehost

आपका स्वागत है कुछहोस्ट में!

somehost ~] $ cd / कुछ / निर्देशिका / कहीं / नाम / फू
somehost फू] $ 

मेरे पास ऐसी स्क्रिप्ट हैं जो यह निर्धारित कर सकती हैं कि मुझे किस मेजबान और किस निर्देशिका में जाना है, लेकिन मैं ऐसा करने का तरीका नहीं खोज सकता:

लोकलहोस्ट ~] $ go_to_dir फू

आपका स्वागत है कुछहोस्ट में!

somehost फू] $

क्या ऐसा करने का कोई आसान, चतुर या कोई तरीका है?

जवाबों:


413

आप निम्न कार्य कर सकते हैं:

ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted ; bash"

इस तरह, आपको directory_wanted पर एक शेल मिलेगा।


व्याख्या

-tबल छद्म टर्मिनल आवंटन। इसका उपयोग दूरस्थ मशीन पर मनमाने ढंग से स्क्रीन-आधारित कार्यक्रमों को निष्पादित करने के लिए किया जा सकता है, जो मेनू सेवाओं को लागू करते समय बहुत उपयोगी हो सकता है।

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

  • यदि आप उपयोग नहीं करते हैं, -tतो कोई संकेत नहीं दिखाई देगा।
  • यदि आप नहीं जोड़ते हैं, ; bashतो कनेक्शन बंद हो जाएगा और आपके स्थानीय मशीन पर नियंत्रण वापस कर देगा

21
मेरे मामले में-लापता भाग
मैथ्यू

2
इस दृष्टिकोण का उपयोग करते समय .bash_profile पढ़ा नहीं जाता है, कोई भी जानता है कि क्यों?
फिलिप

8
मुझे ऐसा करना था: ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && exec \$SHELL"
गुप्त

40
आप आमतौर पर एक लॉगिन शेल चाहते हैं:ssh -t example.com "cd /foo/bar; exec \$SHELL -l"
क्रिश्चियनबॉडी

10
बस ssh लॉगिन पर परिवर्तन निर्देशिका को स्वचालित रूप से लिंक करना चाहता था - सर्वर दोष ; और वहां से इस कमांड को पेस्ट करें (जो @christianbundy द्वारा एक संस्करण है):ssh server -t "cd /my/remote/directory; bash --login"
sdaau

53

आप जोड़ सकते हैं

cd /some/directory/somewhere/named/Foo

अन्य होस्ट पर आपकी .bashrcफ़ाइल (या .profileजिसे आप इसे कहते हैं)। इस तरह, आप जो भी करते हैं या जहां sshसे करते हैं, जब भी आप उस सर्वर पर लॉग इन करते हैं, तो यह cdआपके लिए उचित निर्देशिका के लिए होगा, और आपको जो करना है ssh, वह सामान्य की तरह उपयोग करना है ।

शाप की, rogeriopvl का समाधान भी काम करता है, लेकिन यह एक बहुत अधिक क्रिया है, और आपको इसे हर बार करने के लिए याद रखना होगा (जब तक कि आप एक उपनाम नहीं बनाते हैं) तो यह थोड़ा कम "मजेदार" लगता है।


1
+1, यह अधिक उपयुक्त लगता है अगर आपको ssh कमांड बनाने के बजाय निरंतर निर्देशिका की आवश्यकता होती है जो हर उस समय को याद कर रही है जब आप X मशीन से कनेक्ट होने पर किस निर्देशिका में जाने वाले हैं
Tebe

लचीले ढंग से बदलते समय उचित नहीं है
लुईस चान

21

मैंने SSH और CD के लिए एक सर्वर में लगातार एक उपकरण बनाया है - जिसे sshcd नाम दिया गया है । आपके द्वारा दिए गए उदाहरण के लिए, आप बस उपयोग करेंगे:

sshcd somehost:/some/directory/somewhere/named/Foo

मुझे पता है अगर आप किसी भी प्रश्न या समस्या है!


1
अगर आप ~ / .ssh / config में एक नया
कॉन्फिगर

21

मेरा पसंदीदा तरीका SSH कॉन्फ़िग फ़ाइल (नीचे वर्णित) का उपयोग कर रहा है, लेकिन आपके उपयोग के आधार पर कुछ संभव समाधान हैं।

कमांड लाइन तर्क

मुझे लगता है कि इस दृष्टिकोण के लिए सबसे अच्छा उत्तर क्रिस्चियनबॉडी का स्वीकृत उत्तर है:

ssh -t example.com "cd /foo/bar; exec \$SHELL -l"

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

ssh -t example.com 'cd /foo/bar; exec $SHELL -l'

बैश समारोह

आप इसे bash फंक्शन में रैप करके कमांड को सरल बना सकते हैं। मान लें कि आप इसे टाइप करना चाहते हैं:

sshcd example.com /foo/bar

इसे आप अपने काम से जोड़कर बना सकते हैं ~/.bashrc:

sshcd () { ssh -t "$1" "cd \"$2\"; exec \$SHELL -l"; }

यदि आप एक चर का उपयोग कर रहे हैं जो निर्देशिका के लिए दूरस्थ मशीन पर मौजूद है, तो इसे बचना सुनिश्चित करें या इसे एकल उद्धरण में रखें। उदाहरण के लिए, यह निर्देशिका के लिए सीडी होगी JBOSS_HOMEजो रिमोट मशीन पर चर में संग्रहीत है :

sshcd example.com \$JBOSS_HOME

SSH कॉन्फ़िग फ़ाइल

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

उदाहरण के लिए, मैं केवल यह कमांड टाइप करना चाहता हूं:

ssh qaapps18

लेकिन यह हमेशा इस आदेश की तरह व्यवहार करना चाहते हैं:

ssh -t qaapps18 'cd $JBOSS_HOME; exec $SHELL'

इसलिए मैंने इसे अपनी ~/.ssh/configफ़ाइल में जोड़ा :

Host *apps*
    RequestTTY yes
    RemoteCommand cd $JBOSS_HOME; exec $SHELL

अब यह नियम किसी भी होस्ट के लिए "होस्ट" में उसके होस्टनाम पर लागू होता है।

अधिक जानकारी के लिए, http://man7.org/linux/man-pages/man5/ssh_config.5.html देखें


13

@ Rogeriopvl के उत्तर में परिवर्धन के आधार पर, मैं निम्नलिखित सुझाव देता हूं:

ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && bash"

द्वारा आदेशों का पीछा &&करते हुए अगले कमांड को केवल तभी चलाया जाएगा जब पिछला एक सफल था (जैसा कि उपयोग करने का विरोध किया गया है ;, जो क्रमिक रूप से आदेशों को निष्पादित करता है)। यह विशेष रूप से तब उपयोगी होता है जब cdकमांड को पूरा करने वाले डायरेक्टरी की आवश्यकता होती है ।

निम्नलिखित करने की कल्पना करें:

/home/me$ cd /usr/share/teminal; rm -R *

निर्देशिका teminalमौजूद नहीं है, जो आपको होम डायरेक्टरी में बने रहने और निम्नलिखित कमांड के साथ सभी फाइलों को हटाने का कारण बनता है।

यदि आप उपयोग करते हैं &&:

/home/me$ cd /usr/share/teminal && rm -R *

निर्देशिका नहीं मिलने के बाद कमांड विफल हो जाएगी।


1
सिंगल कोट्स का इस्तेमाल किया है और एक बार बिना && वाले कमांड के साथ डबल कोट्स नहीं किए हैं और यह मुझे बट में खराब करता है, बुरा ... मेरा सबक सीखा।
गैविन पिकिन

4

मेरे बहुत ही विशिष्ट मामले में, मैं सिर्फ एक रिमोट होस्ट में एक कमांड निष्पादित करना चाहता था, जेनकिंस दास मशीन से एक विशिष्ट निर्देशिका के अंदर:

ssh myuser@mydomain
cd /home/myuser/somedir 
./commandThatMustBeRunInside_somedir
exit

लेकिन मेरी मशीन ssh प्रदर्शन नहीं कर सकी (यह एक छद्म ट्टी आवंटित नहीं की जा सकती है जो मुझे लगता है) और मुझे निम्नलिखित त्रुटि देते हुए रखा:

Pseudo-terminal will not be allocated because stdin is not a terminal

मैं ssh कमांड के एक पैरामीटर के रूप में "cd to dir + my कमांड" को पास करने के लिए (एक छद्म टर्मिनल को आवंटित नहीं करने के लिए) और विकल्प -T पास करके स्पष्ट रूप से ssh कमांड को बता सकता हूं जो उसने किया था। छद्म टर्मिनल आवंटन की आवश्यकता नहीं है।

ssh -T myuser@mydomain "cd /home/myuser/somedir; ./commandThatMustBeRunInside_somedir"

3

मैं पर्यावरण चर CDPATH का उपयोग करता हूं


उपयोगी केवल तभी जब मैं प्रति मशीन एक निर्देशिका में रुचि रखता था। मुझे दूरस्थ मशीन को जानकारी देने का एक तरीका चाहिए। रोजर का समाधान यही करता है।
फ्रॉस्टी

2

-tविचार के साथ एक कदम आगे जाना । मैं स्क्रिप्ट्स का एक सेट अपने नीचे आने वाले मेजबानों में विशिष्ट स्थानों पर जाने के लिए नीचे बुला रहा हूं। मैं उन सभी को अपने पास रखता हूं ~/binऔर उस निर्देशिका को अपने पथ पर रखता हूं।

#!/bin/bash

# does ssh session switching to particular directory
# $1, hostname from config file 
# $2, directory to move to after login
# can save this as say 'con' then
# make another script calling this one, e.g.
# con myhost repos/i2c

ssh -t $1 "cd $2; exec \$SHELL --login"

1

लॉग इन करने के बाद सीधे जाने का एक और तरीका "अलियास" है। जब आप अपने सिस्टम में लॉगिन करते हैं तो केवल उस उपनाम को टाइप करें और आप उस निर्देशिका में होंगे।

उदाहरण: उपनाम = myfolder '/ var / www / फ़ोल्डर'

यदि आप अपने सिस्टम प्रकार में लॉग इन करते हैं, तो उपनाम (यह सिस्टम के किसी भी भाग से काम करता है)
यह कमांड यदि bashrc में नहीं है तो वर्तमान सत्र के लिए काम करेगा। तो आप इस उपनाम को भविष्य में उपयोग करने के लिए bashrc में जोड़ सकते हैं

$ myfolder => आपको उस फ़ोल्डर में ले जाता है


-3

SSH स्वयं संचार का एक साधन प्रदान करता है, यह निर्देशिकाओं के बारे में कुछ भी नहीं जानता है। चूंकि आप निर्दिष्ट कर सकते हैं कि किस दूरस्थ कमांड को निष्पादित करना है (यह डिफ़ॉल्ट रूप से - आपका शेल है), मैं वहां शुरू करूंगा।


4
यह एक आंशिक उत्तर है, समाधान नहीं।
AL

-7

बस कमांड के साथ अपने घर को संशोधित करें: usermod -d /newhome username


1
सलाह नहीं दी। अपने होम डायरेक्टरी को बदलने से संभवतः अन्य चीजें टूट जाएंगी।
Bronson
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.