मेरे (तीसरे) पीसी से दो दूरस्थ मेजबान के बीच एससीपी


136

मेरे पास दो रिमोट होस्ट हैं।
host1-> 10.3.0.1
host2-> 10.3.0.2
दोनों एक ssh सर्वर चलाते हैं।

Ssh सर्वर होस्ट 1 में पोर्ट 22 पर और होस्ट 69 में पोर्ट 6969 पर सुनता है। अब, अपनी स्थानीय मशीन का उपयोग करते हुए, मुझे ssh के माध्यम से host1 या host2 में लॉग इन किए बिना host1 से host2 के लिए कुछ कॉपी करने की आवश्यकता है। कुछ इस तरह,

scp user@10.3.0.1:/path/to/file user@10.3.0.2/path/to/file

मैं यह कैसे कर सकता हूं, कृपया ध्यान दें कि दोनों होस्ट ssh के लिए अलग-अलग पोर्ट का उपयोग करते हैं।


क्या आप पूछ रहे हैं कि क्या आप रिमोट होस्ट से रिमोट होस्ट में ट्रांसफर कर सकते हैं, या आप यह पूछ रहे हैं कि पासवर्ड सप्लाई किए बिना इसे कैसे किया जाए?
ग्लेन जैकमैन

जबकि -Pरिमोट-टू-रिमोट ट्रांसफर के मामले में, पोर्ट का उपयोग करने के लिए ध्वज निर्दिष्ट करने के लिए मौजूद है, प्रति-होस्ट पोर्ट को निर्दिष्ट करने के तरीके के रूप में कोई परिभाषित व्यवहार नहीं है ...
मानवरोन

जवाबों:


216

अतीत में, जिस तरह से scpकाम किया, जब रिमोट सिस्टम के बीच फ़ाइलों को कॉपी करने के लिए ( भोले रूप से ) कहा जाता था, तो बहुत असुविधाजनक था: यदि आपने लिखा है, उदाहरण के लिए

    scp user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt

scpपहले sshरिमोट 1 पर एक सत्र खोलेगा, और फिर यह scpवहाँ से रिमोट 2 तक चलेगा। इस काम के लिए, आपको रिमोट 1 पर रिमोट 2 के लिए प्राधिकरण क्रेडेंशियल्स सेट करना होगा।

इसे करने का आधुनिक तरीका, इसके बजाय, ("आधुनिक" क्योंकि यह केवल कुछ साल पहले लागू किया गया था, और शायद हर किसी के पास एक- -3योग्य नहीं है scp) को दो चरणों की आवश्यकता होती है। पहला आवश्यक कदम यह है ~/.ssh/configकि रिमोट 1 और रिमोट 2, दोनों के कनेक्शन के लिए सभी विकल्प सेट करें।

    Host remote1.example.org
    Port 2222
    IdentityFile /path/to/host1-id_rsa

    Host remote2.example.org
    Port 6969
    IdentityFile /path/to/host2-id_rsa

इस तरह से यह आदेश के लिए सभी आवश्यक विकल्प पारित करने के लिए संभव हो जाता है अस्पष्टता के बिना : उदाहरण के लिए, अगर हम CLI पर कहा था कि उपयोग बंदरगाह 2222 से ऊपर विन्यास के बिना, यह स्पष्ट नहीं है कि क्या हम की चर्चा करते हुए किया गया हो गया होता remote1 या करने के लिए remote2 , और इसी तरह क्रिप्टोग्राफिक कुंजी वाली फ़ाइल के लिए। इस तरह सीएलआई सुव्यवस्थित और सरल बना हुआ है।

दूसरे, -3विकल्प का उपयोग करें , इस प्रकार है:

    scp -3 user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt

-3विकल्प का निर्देश scpपीसी जिस पर आदेश जारी किया जाता है, भले ही यह हस्तांतरण करने के लिए एक 3 पार्टी है के माध्यम से मार्ग यातायात के लिए। इस तरह, प्राधिकरण क्रेडेंशियल जारीकर्ता पीसी, तीसरे पक्ष पर ही रहना चाहिए।


6
भविष्य के संदर्भ के लिए: यदि आप दो होस्टों के बीच एक फ़ाइल की प्रतिलिपि बनाते हैं जो एक पहचान फ़ाइल (जैसे EC2 उदाहरण) साझा करते हैं, तो आपको कॉन्फ़िगरेशन फ़ाइल की आवश्यकता नहीं है। एक-एक तर्क दोनों मेजबानों को जोड़ने के लिए पर्याप्त है।
अर्तुर कज्जाका

1
Google Compute Engine के लिए भी ध्यान देने योग्य बात है, आपकी ~/.ssh/configफ़ाइल में जोड़ने के लिए समर्थन है : cloud.google.com/compute/docs/gcloud-compute लेकिन मुझे नहीं लगता कि AWS का समान समर्थन है
modulitos

1
चूँकि आप सामान्य रूप से आउटपुट नहीं देखेंगे, इसलिए एक टिप क्रिया मोड को सक्षम करने के लिए है -v
प्रात

6

पिछली बार जब मैंने यह कोशिश की थी, तो scp ऐसा करने में सक्षम नहीं था। आपकी कमांड लाइन ठीक लग रही है। यह काम करेगा:

ssh -p port_on_machine1 user@machine1 "cat /path/to/file/one"|ssh -p port_on_machine2 user@machine2 "cat >/path/to/file/two"

मेरा scp मैन पेज कहता है, "दो दूरस्थ मेजबानों के बीच कॉपियों की भी अनुमति है।"
बजे ग्लेन जैकमैन

1
धन्यवाद, यह सुनना अच्छा है। स्कैप करने के लिए आप एक पी-फ्लैग दे सकते हैं (यह कुछ बीएसडी लोगों द्वारा लिखा गया था, इसका कारण यह है कि इसका तर्क हैंडलिंग बहुत दुखद है :-(), लेकिन ऐसा लगता है कि आप दूरस्थ मेजबानों पर विभिन्न बंदरगाहों को निर्दिष्ट नहीं कर सकते। मुझे खेद है। लेकिन मुझे लगता है, केवल इस वर्कअराउंड लेफ़्ट (या ssh का उपयोग करके बहुत सारे ट्रिकियर सॉल्यूशंस हैं, उदाहरणार्थ sftpfs से बचने के लिए, लेकिन वे सरलतम नहीं हैं)। मैंने पोर्ट सेटिंग्स के साथ अपने वर्कअराउंड को बढ़ाया
user259412

4

मेरे मामले में, मैं एक रिमोट टू रिमोट कॉपी कर रहा था, इस -3तर्क को खारिज कर दिया। '-P' पैरामीटर के साथ दिया गया पोर्ट 1 सर्वर के साथ काम करता है, लेकिन पोर्ट 22 का उपयोग 2 के साथ किया जाता है।

ssh -P 1234 user@server1.mydomain.com user@server2.otherdomain.com

समाधान /etc/ssh/ssh_configफ़ाइल को server1इन पंक्तियों को संपादित करने और जोड़ने के लिए है:

Host *.otherdomain.com
   Port  1234

इस तरह, पोर्ट 1234 का उपयोग उन दोनों के लिए किया जाता है। यह अलग भी हो सकता है।

इस समाधान में पिछले समाधानों की तुलना में बेहतर थ्रूपुट है, क्योंकि कम्युनिकेशन प्रत्यक्ष है।


पेरेस वहाँ एक रास्ता है जो कॉमैन लाइन से दो अलग-अलग रिमोट मशीनों के लिए दो अलग-अलग बंदरगाहों के माध्यम से एससीपी प्राप्त करता है?
रेड बोतल

4

स्रोत और लक्ष्य को प्रपत्र में एक URI के रूप में निर्दिष्ट किया जा सकता है: // [उपयोगकर्ता @] होस्ट [: port] [/ path]

तो आप चला सकते हैं:

scp -3 scp://user@10.3.0.1:22/path/to/file scp://user@10.3.0.2:6969/path/to/file
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.