मध्यवर्ती होस्ट के माध्यम से scp फाइलें


84

मेरे पास 3 मशीनों, ए, बी और सी तक पहुंच है। केवल संभव (एसएचएस) कनेक्शन हैं:

A -> B
B <-> C

मुझे ए से सी तक की फाइलें प्राप्त करने की आवश्यकता है, इसलिए मैं ए से बी तक की फ़ाइलों को स्कैन कर सकता हूं, और फिर उन्हें बी से सी तक भेज सकता हूं। हालांकि, बी में बहुत अधिक डिस्क स्थान नहीं है, इसलिए यह एक विकल्प नहीं है। क्या A से C तक फ़ाइलों को B के माध्यम से स्कैन करने का एक तरीका है? ध्यान दें, मेरे पास किसी भी मशीन पर रूट एक्सेस नहीं है, इसलिए मुझे नहीं लगता कि मैं किसी भी लगातार सुरंग स्थापित कर सकता हूं, लेकिन अगर मैं गलत हूं तो मुझे सुधारें!


6
मुझे पता है कि यह सवाल का जवाब नहीं देता है, लेकिन उन लोगों के लिए जो rsync के बारे में नहीं जानते हैं, या यह नहीं जानते कि मेजबान के माध्यम से हॉप करने के लिए इसका उपयोग कैसे करें, यह एक उपयोगी टिप हो सकता है: '-e' विकल्प का उपयोग करें इस तरह rsync के साथ:A$ rsync <options> -e 'ssh B ssh' source C:destination
Eddified

जवाबों:


107

ProxyJump

ओपनएसएसएच 7.3 में नया:

A$ scp -oProxyJump=B thefile C:destination

(पर्दे के पीछे, यह सिर्फ प्रॉक्सीमेन्ड और का उपयोग करता है ssh -W।)

ProxyCommand

शामिल करने के लिए अद्यतन -W अन्य उत्तरों से:

A$ scp -oProxyCommand="ssh -W %h:%p B" thefile C:destination

यदि A के पास बहुत पुराना SSH क्लाइंट स्थापित है ( -Wसमर्थन के बिना ), या यदि B को TCP अग्रेषण को हटाने के लिए कॉन्फ़िगर किया गया है (लेकिन फिर भी शेल कमांड की अनुमति देता है), तो विकल्प का उपयोग करें:

A$ scp -oProxyCommand="ssh B socat stdio tcp:%h:%p" thefile C:destination
A$ scp -oProxyCommand="ssh B nc %h %p" thefile C:destination

पाइप्स

A$ tar cf - thefile anotherfile | ssh B "ssh C \"cd destination && tar xvf -\""
A$ (echo thefile; echo anotherfile) | cpio -o | ssh B "ssh C \"cd destination && cpio -i\""

केवल एक फ़ाइल के लिए:

A$ ssh B "ssh C \"cd destination && cat > thefile\"" < thefile

बी के माध्यम से "सुरंग"

A$ ssh -f -N -L 4567:C:22 B
(continues running in background)

A$ scp -P 4567 thefile localhost:destinationPath

जब आप कर लें, तो पहले से शुरू की गई sshप्रक्रिया को मारना न भूलें (जो कि पृष्ठभूमि के कारण गिरा है -f -N)।

  • -fकमांड निष्पादन से ठीक पहले पृष्ठभूमि पर जाने के लिए ssh अनुरोध करता है। यह उपयोगी है यदि ssh पासवर्ड या पासफ़्रेज़ माँगने जा रहा है, लेकिन उपयोगकर्ता इसे पृष्ठभूमि में चाहता है। इसका तात्पर्य है -n।
  • -Nरिमोट कमांड निष्पादित न करें। यह सिर्फ अग्रेषित बंदरगाहों के लिए उपयोगी है।

बी से ए के माध्यम से "सुरंग" को उल्टा करें

हालांकि हमेशा काम नहीं करता है:

A$ ssh -f -N -R 4567:localhost:22 B
(now you can reach A from B, by using localhost:4567)

B$ scp -P 4567 localhost:thefile C:destination
  • -R निर्दिष्ट करता है कि दूरस्थ (सर्वर) होस्ट पर दिए गए टीसीपी पोर्ट या यूनिक्स सॉकेट के कनेक्शन स्थानीय होस्ट पर दिए गए होस्ट और पोर्ट या यूनिक्स सॉकेट के लिए भेजे जाने हैं।

इन उदाहरणों @grawity के लिए बहुत बहुत धन्यवाद। एक सवाल - क्या यह संभव है कि 'टार सी इफाइल अदरफाइल | ssh B "ssh C \" cd गंतव्य && tar xv \ "" being C से A तक डाउनलोड कॉपी करने के लिए
sh

@dmeu: हाँ, यह संभव है।
ग्रैविटी

यदि मैं MacOS का उपयोग कर रहा हूं, तो पहले ही शुरू की गई ssh प्रक्रिया को "मार" कैसे?
एयरो विंडवॉकर

ध्यान दें: हमेशा की तरह, आप करना चाहते हैं scp से सी, हालांकि बी, के लिए एक, आप कर सकते हैं A$ scp -oProxyJump=B C:destination thefile
jvriesem

@ पाब्लो बेहतर उपयोग -S, तब, और -O से बाहर निकलें। या ... कम से कम pkill -f।
विशालकाय

24

2011 के शुरुआत से scp के संस्करण और बाद में "-3" विकल्प हो सकता है:

 -3      Copies between two remote hosts are transferred through the local
         host.  Without this option the data is copied directly between
         the two remote hosts.  Note that this option disables the
         progress meter.

यदि आपके पास यह है तो आप बस चला सकते हैं:

B$ scp -3 A:file C:file

मेरे मामले में मेजबान ए केवल बी (जो वीपीएनड था) से सुलभ था। होस्ट सी एक ही लैन पर था जैसा कि बी। मैं ए से सी तक एक फ़ाइल प्राप्त करना चाहता था और एससीपी -3 ने इसे शानदार ढंग से हल किया।
जो

मुझे इससे परेशानी हुई जब दोनों मेजबानों ने एक पासवर्ड का अनुरोध किया। यह दोनों के लिए एक ही बार में पूछना होगा (दो पासवर्ड प्रॉम्प्ट एक ही पंक्ति में दिखाई दिए) और फिर यह मेरा पासवर्ड स्वीकार करने में विफल रहा। मैं अंततः अपना पासवर्ड बार-बार टाइप करके काम कर सकता था (दोनों मेजबानों पर एक ही पासवर्ड), लेकिन यह पता लगाना कठिन था।
कॉलिन डी

8

लगभग सभी पहले ही कह चुके हैं, लेकिन यहाँ मेरा आखिरी पैसा है: मैं प्रोक्सीकोमैंड संस्करण का उपयोग करता हूं ncऔर न ही बिना socOpenSSH परदे के पीछे और जम्फोस्ट कुकबुक के आधार पर मैंने निम्नलिखित विन्यास तैयार किया:

  1. इसलिए हमारे पास निम्नलिखित खिलाड़ी हैं:

    • HOME_HOST: यह वह जगह है जहाँ से हम एक फ़ाइल को लक्ष्य होस्ट में कॉपी करते हैं
    • HOP_HOST: हम इस होस्ट (HOP_USER के रूप में लॉग इन) के माध्यम से कॉपी करते हैं
    • TARGET_HOST: यह हमारी मंजिल है (TARGET_USER के रूप में प्रमाणित)
  2. सबसे पहले मैं अपने घर मेजबान से अपने स्थानीय सार्वजनिक कुंजी जोड़ा .ssh/id_dsa.pub करने के लिए .ssh/authorized_keysदोनों हॉप और लक्ष्य मेजबान पर। हां, होम होस्ट से दोनों के लिए एक ही सार्वजनिक कुंजी। आमतौर पर आप उम्मीद करेंगे कि यह HOP सार्वजनिक कुंजी है जिसे आपको TARGET में जोड़ना है।

  3. फिर मैंने .ssh/configनिम्नलिखित प्रविष्टि को जोड़कर थोड़ा ट्विक किया:

    Host TARGET_HOST
       User TARGET_USER
       ProxyCommand ssh -W %h:%p HOP_USER@HOP_HOST
    
  4. उसके बाद प्रति आपरेशन के रूप में सरल है: scp FILE TARGET_HOST:। यह हॉप और टारगेट नोड्स दोनों से डबल बैनर्स प्रदर्शित करता है लेकिन यह काम करता है।

बेशक आप सीधे लक्ष्य पर ssh करने के लिए ऊपर उपयोग कर सकते हैं ssh TARGET_HOST:। यह scp और ssh के साथ काम करता है।

एक और सामान्य विकल्प sshuttle उपयोगिता हो सकती है जो एक प्रकार का पारदर्शी प्रॉक्सी (vpn over ssh) प्रतीत होता है। इसलिए आपके मामले में A-> B <-> C यह C के नेटवर्क पर प्रत्येक नोड से जुड़ने की अनुमति देता है: A-> B- [CDEFG]। इसके लिए व्यवस्थापक की आवश्यकता नहीं है लेकिन इसके लिए पाइथन 2.7 (3.5 भी ठीक है) की आवश्यकता होती है जो हमेशा हमारे पास नहीं होता है। यह कोशिश करने के लायक है।


7
ssh -L 4321:hostC:22 youruser@hostB

दूसरे शेल में:

scp -P 4321 localfile youruser@127.0.0.1

यह पोर्ट फ़ॉरवर्डिंग का उपयोग कर रहा है। यहाँ केवल सीमा होस्ट बी है जो पोर्ट अग्रेषण की अनुमति देने के लिए कॉन्फ़िगर करने की आवश्यकता है। अन्यथा यह ठीक काम करना चाहिए।

स्पष्टीकरण के तरीके में, -Lऔर -Rआपको बंदरगाहों को अग्रेषित करने की अनुमति देता है। इसमें -Lदिया गया पहला पोर्ट है, पोर्ट ssh ओरिजिनेटिंग मशीन (होस्ट A) पर सुनना शुरू करेगा, और यह B को होस्ट करने के लिए आपके SSH कनेक्शन पर उस पोर्ट पर प्राप्त होने वाली किसी भी चीज़ को फॉरवर्ड करेगा, फिर पोर्ट 22 पर C होस्ट करने के लिए रूट।

संपादित करें

मैंने वाक्य रचना को थोड़ा गड़बड़ कर दिया। यह आपके LOCAL मशीन पर एक फ़ॉरवर्ड सेट करता है।


@astrofrog - यदि हमारा कोई उत्तर आपकी आवश्यकताओं को पूरा करता है, तो आपको शायद उनमें से किसी एक को स्वीकार करना चाहिए।
ब्रायन वंडेनबर्ग

2

Grawity's ProxyCommand जवाब ने मेरे लिए काम किया लेकिन जब से मैं SSH से कम परिचित हूँ तब से कुछ प्रयोग करने लगे। मैंने सोचा था कि मैं खुद की तरह SSH को किसी भी अन्य newbies की मदद करने के लिए अधिक विस्तार के साथ Grawity के उत्तर को वर्तनी में लिखूंगा। यहाँ अधिक स्पष्ट संकेतन की परिभाषाएँ दी गई हैं:

मशीन A: मशीन आप पर है

सर्वर B: userB@ip.address.for.B (जंप होस्ट या मिडिल सर्वर)

सर्वर C: userC@ip.address.for.C (वह दूरस्थ सर्वर जिसे आप कॉपी करना चाहते हैं)

ProxyCommnad

    A$ scp -oProxyCommand="ssh -W %h:%p userB@ip.address.for.B" thefile userC@ip.address.for.C:destination

ठोस उदाहरण

इसलिए एक ठोस उदाहरण के लिए, मान लें कि आपके पास IP 0.0.1.2नाम वाले barसर्वर (सर्वर C) वाले सर्वर तक पहुंच है । लेकिन इसे प्राप्त करने के लिए आपको सबसे पहले IP 0.0.1.1नाम वाले fooसर्वर (सर्वर B) वाले सर्वर में लॉगिन करना होगा । अब आप baz.txtअपनी वर्तमान मशीन (मशीन A) पर स्थित फ़ाइल को सर्वर 0.0.1.2की /home/bar/निर्देशिका में कॉपी करना चाहते हैं । इस उदाहरण के लिए उपरोक्त प्रॉक्सी का उपयोग करने के लिए आप निम्नलिखित कार्य करेंगे:

    A$ scp -oProxyCommand="ssh -W %h:%p foo@0.0.1.1" baz.txt bar@0.0.1.2:/home/bar/

आप फाइल और डेस्टिनेशन के क्रम को बदलकर सर्वर सी की फाइल को आसानी से कॉपी कर सकते हैं। उदाहरण के लिए, यदि baz.txtपहले से ही सर्वर पर 0.0.1.2स्थित था /home/bar/तो आप इसका उपयोग करके अपनी मशीन पर कॉपी कर सकते हैं:

    A$ scp -oProxyCommand="ssh -W %h:%p foo@0.0.1.1" bar@0.0.1.2:/home/bar/baz.txt /destination/path/on/A

आशा है कि यह उन लोगों की मदद करता है, जिन्हें दूसरों की तुलना में थोड़ी अधिक चीजों की आवश्यकता होती है।

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