दूसरे रिमोट होस्ट के साथ कैसे स्केप करें


83

मुझे आश्चर्य है कि अगर मेरे लिए एक रास्ता है रिमोटली 2 होस्ट से सीधे एससीपी फाइल को रिमोट 1 होस्ट के माध्यम से जाने से।

नेटवर्क केवल रिमोट 1 होस्ट से रिमोट 2 होस्ट के कनेक्शन की अनुमति देता है। इसके अलावा, न तो रिमोट 1 होस्ट और न ही रिमोट 2 होस्ट मेरे स्थानीय मशीन को स्कैन कर सकते हैं।

क्या कुछ ऐसा है:

scp user1@remote1:user2@remote2:file .

पहली खिड़की: ssh remote1फिर scp remot2:file .

दूसरा खोल: scp remote1:file .

पहली खिड़की: rm file; logout

मैं इन सभी चरणों को करने के लिए एक स्क्रिप्ट लिख सकता था, लेकिन अगर कोई सीधा रास्ता है, तो मैं इसका उपयोग करूंगा।

धन्यवाद।

संपादित करें: मैं SSH सुरंगों को खोलने की तरह कुछ सोच रहा हूं, लेकिन मुझे इस बात पर भ्रम है कि कहां रखा जाए।

फिलहाल, एक्सेस करने के लिए remote1, मेरे पास $HOME/.ssh/configमेरी लोकल मशीन में निम्नलिखित हैं।

Host remote1
   User     user1
   Hostname localhost
   Port     45678

एक बार remote1एक्सेस करने के लिए remote2, यह मानक स्थानीय DNS और पोर्ट 22 है। मुझे क्या करना चाहिए remote1और / या बदलना चाहिए localhost?

जवाबों:


95

मुझे किसी एक कमांड में सीधे फाइल को कॉपी करने का कोई तरीका नहीं पता है, लेकिन यदि आप बैकग्राउंड में SSH इंस्टेंस को चलाने के लिए एक पोर्ट फॉरवर्डिंग टनल को खुला रखना स्वीकार कर सकते हैं, तो आप फाइल को एक कमांड में कॉपी कर सकते हैं।

ऐशे ही:

# First, open the tunnel
ssh -L 1234:remote2:22 -p 45678 user1@remote1
# Then, use the tunnel to copy the file directly from remote2
scp -P 1234 user2@localhost:file .

ध्यान दें कि आप user2@localhostवास्तविक scpकमांड के रूप में कनेक्ट करते हैं , क्योंकि यह लोकलहोस्ट पर पोर्ट 1234 पर है कि पहला sshउदाहरण आगे के कनेक्शनों को सुन रहा है remote2। ध्यान दें कि आपको प्रत्येक बाद की फ़ाइल कॉपी के लिए पहले कमांड चलाने की आवश्यकता नहीं है; आप बस इसे चलाना छोड़ सकते हैं।


1
धन्यवाद, ऐसा लगता है कि मुझे इसकी आवश्यकता है। इसलिए मैंने सुरंग बनाई, फिंगरप्रिंट सर्वर से मेल खाता है, लेकिन मेरे पास "अनुमति अस्वीकृत (publickey)" त्रुटि है। मुझे लगता है कि मुझे अपने नेटवर्क / sysadmin से यह पूछने की आवश्यकता है कि यह काम क्यों नहीं कर रहा है।
Danosaure

3
धन्यवाद! मैं बदलना पड़ा -p 45678करने के लिए -p 22के रूप में मेरे remote1 SSH बंदरगाह 22 सुन रहा है
Montaro

मुझे भी -p 22इसके बजाय उपयोग करना था -p 45678scp -P 1234 ...मेरे लिए भी काम नहीं करता है। मैं हो रही है ssh: connect to host localhost port 1234: Connection refused। जब मैंने scp -P 22 ...इसके साथ काम किया, लेकिन यह फ़ाइल remote 1को मेरे स्थानीय मशीन ( remote2) पर कॉपी नहीं कर रहा है ।
पापी

उसी के लिए कोई यूआई उपकरण?
एक्सप्लोरेशनएप्पल

70

दोहरा ssh

यहां तक ​​कि आपके जटिल मामले में, आप; एकल कमांड लाइन का उपयोग करके फ़ाइल ट्रांसफर को संभाल सकते हैं; ssh;-)
और यह उपयोगी है यदि remote1इससे कनेक्ट नहीं किया जा सकता है localhost:

ssh user1@remote1 'ssh user2@remote2 "cat file"' > file

tar

लेकिन आप फ़ाइल गुणों (स्वामित्व, अनुमतियाँ ...) को ढीला करते हैं।

हालाँकि, tarये फ़ाइल गुण रखने के लिए आपका मित्र है:

ssh user1@remote1 'ssh user2@remote2 "cd path2; tar c file"' | tar x

आप नेटवर्क बैंडविड्थ को कम करने के लिए सेक भी कर सकते हैं:

ssh user1@remote1 'ssh user2@remote2 "cd path2; tar cj file"' | tar xj

और tarआपको मूल के माध्यम से एक पुनरावर्ती निर्देशिका को स्थानांतरित करने की भी अनुमति देता है ssh:

ssh user1@remote1 'ssh user2@remote2 "cd path2; tar cj ."' | tar xj

ionice

यदि फ़ाइल बहुत बड़ी है और आप अन्य महत्वपूर्ण नेटवर्क अनुप्रयोगों को परेशान नहीं करना चाहते हैं, तो आप नेटवर्क द्वारा प्रदान की गई थ्रूपुट सीमाscp और rsyncउपकरण (जैसे scp -l 1024 user@remote:file1 Mbit / second से अधिक का उपयोग नहीं करता है) को याद कर सकते हैं ।

लेकिन, ioniceएकल कमांड लाइन रखने के लिए वर्कअराउंड का उपयोग किया जाता है :

ionice -c2 -n7 ssh u1@remote1 'ionice -c2 -n7 ssh u2@remote2 "cat file"' > file

नोट: ioniceपुराने वितरण पर उपलब्ध नहीं हो सकता है।


सभी विवरण के लिए धन्यवाद, लेकिन मुझे लगता है कि Dolda2000 का समाधान आसान है। यह कुछ ऐसा था जो मैं कोशिश कर रहा था लेकिन यह पता नहीं लगा सका।
दानोसेर

5
यह एक शानदार जवाब है और अधिक वोटों का हकदार है। मेरी राय में स्वीकृत उत्तर की तुलना में यह बहुत आसान है।
ऋक स्मिथ-उन्नाव

2
मैं मानता हूं कि स्वीकृत उत्तर की तुलना में यह एक बेहतर समाधान है। इस तरह, कनेक्शन स्वचालित रूप से साफ हो जाता है।
डग

धन्यवाद, बहुत अच्छा जवाब! कैसे दूसरे रास्ते के बारे में, स्थानीय से दूरदराज के लिए नकल?
DOMTomCat

31

यह चाल चलेगा:

scp -o 'Host remote2' -o 'ProxyCommand ssh user@remote1 nc %h %p' \ 
    user@remote2:path/to/file .

फ़ाइल को remote2सीधे होस्ट से SCP करने के लिए, दो विकल्प ( Hostऔर ProxyCommand) को अपनी ~ / .shsh / config फाइल में जोड़ें (सुपरसुअर पर यह उत्तर भी देखें )। तब आप चला सकते हैं:

scp user@remote2:path/to/file .

अपने स्थानीय मशीन के बारे में सोचने के लिए बिना remote1


अच्छा तरीका! हालांकि -o 'Host remote2'कमांड लाइन से लॉन्च करते समय वास्तव में आवश्यक नहीं लगता है (यानी एक बार कॉपी करने के लिए बिना ~ /। Ssh / config)
माइक

मुझे भी। यह मेरे बिना काम करता है -o 'Host remote2'। धन्यवाद।
पापी

7

ओपनश संस्करण 7.3 और ऊपर के साथ यह आसान है। Config फ़ाइल में ProxyJump विकल्प का उपयोग करें ।

# Add to ~/.ssh/config 
Host bastion
    Hostname bastion.client.com
    User userForBastion
    IdentityFile ~/.ssh/bastion.pem

Host appMachine
    Hostname appMachine.internal.com
    User bastion
    ProxyJump bastion                   # openssh 7.3 version new feature ProxyJump
    IdentityFile ~/.ssh/appMachine.pem. #no need to copy pem file to bastion host  

लॉगिन या कॉपी करने के लिए चलाने के लिए आदेश देता है

ssh appMachine   # no need to specify any tunnel. 
scp helloWorld.txt appMachine:.   # copy without intermediate jumphost/bastion host copy.** 

यदि आप कॉन्फ़िगर फ़ाइल में कॉन्फ़िगर नहीं किया गया है, तो आप ssh कमांड के विकल्प "-J" का उपयोग करके बस्टियन जंप होस्ट को निर्दिष्ट कर सकते हैं।

नोट scp अभी तक "-J" ध्वज का समर्थन नहीं करता है । (मैं मैन पेजों में नहीं मिल सका। हालांकि, ऊपर scp विन्यास फाइल सेटिंग के साथ काम करता है)


1
अगर यह केवल proxing (यानी कोई अलग पहचान आदि) के लिए उपयोग किया जाता है, तो कॉन्फिगरेशन फ़ाइल में bastion सर्वर को जोड़ने की कोई आवश्यकता नहीं है, बस AppMachine अनुभाग में ProxyJump bastion.client.com जोड़ें।
तोमर कोहेन

1

इसमें एक नया विकल्प यह है scpकि हाल ही में एक ही काम के लिए यह जोड़ना बहुत सुविधाजनक है, यह है -3

टीएल; डीआर वर्तमान होस्ट के लिए जो पहले से ही ssh config फ़ाइलों में प्रमाणीकरण स्थापित करता है, बस करें:

scp -3 remote1:file remote2:file

आपका scpहाल के संस्करणों से होना चाहिए।

अन्य सभी उल्लिखित तकनीक के लिए आपको रिमोट 1 से रिमोट 2 या इसके विपरीत प्रमाणीकरण स्थापित करने की आवश्यकता होती है, जो हमेशा एक अच्छा विचार नहीं है।
तर्क का -3मतलब है कि आप वर्तमान होस्ट को मध्यस्थ के रूप में उपयोग करके दो दूरस्थ होस्ट से फ़ाइलों को स्थानांतरित करना चाहते हैं, और यह होस्ट वास्तव में दोनों दूरस्थ होस्ट को प्रमाणीकरण करता है, इसलिए उन्हें एक दूसरे तक पहुंच नहीं है।
आपको बस ssh config फाइल में ऑथेंटिकेशन को सेटअप करना होगा, जो काफी आसान और अच्छी तरह से डॉक्यूमेंटेड है, और फिर टीएल-डीआर में कमांड को रन करें;

इस उत्तर का स्रोत https://superuser.com/a/686527/713762 है


0

यह विन्यास मेरे लिए अच्छा काम करता है:

Host jump
   User username
   Hostname jumphost.yourorg.intranet
Host production
   User username
   Hostname production.yourorg.intranet
   ProxyCommand ssh -q -W %h:%p jump

फिर आज्ञा

scp myfile production:~

Myfile को उत्पादन मशीन में कॉपी करता है ।


0

यहाँ Olibre के समाधान के लिए छोटा सा जोड़ा , जो मैंने इस स्रोत का उपयोग करके काम किया ।

जैसे आपके पास tarदूरस्थ होस्ट से स्थानीय में प्रतिलिपि बनाने के लिए उपयोग करने के लिए तीन तरीके हैं , स्थानीय होस्ट से दूरस्थ होस्ट के लिए निम्नलिखित कार्य दोहरे ssh स्थितियों में कॉपी करते हैं: (उन्हें उस निर्देशिका में चलाएँ जहाँ से फ़ाइलों की प्रतिलिपि बनाई जानी है, अन्यथा फ़ुलपैथ का उपयोग करें /फ़ाइल का नाम)

बिना कंप्रेशन के सिंगल फाइल ट्रांसफर करें:

tar c filename |  ssh user1@remote1 'ssh -Y user2@remote2 "path2 && tar x"'

संपीड़न के साथ एकल फ़ाइल स्थानांतरण:

tar cj filename |  ssh user1@remote1 'ssh -Y user2@remote2 "path2 && tar xj"'

पुनरावर्ती निर्देशिका स्थानांतरण:

tar cj . |  ssh user1@remote1 'ssh -Y user2@remote2 "path2 && tar xj"'

यहां && कमांड को चलने से रोकता है यदि कमांड का पहला भाग काम नहीं करता है - उदाहरण के लिए यदि निर्देशिका गायब है या स्रोत / गंतव्य पथ नामों में कोई त्रुटि है।

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