मैं मल्टीशॉप SCP ट्रांसफ़र कैसे करूँ?


85

मैं अपनी मशीन A से सर्वर C की फ़ाइल कॉपी करना चाहता हूं, लेकिन केवल सर्वर B के माध्यम से सर्वर C तक पहुंच है।

पहले सर्वर बी में स्थानांतरित करने के बजाय, लॉग इन करें और फिर सर्वर सी में स्थानांतरित करें, क्या फ़ाइल को सीधे एससीपी या इसी तरह के कार्यक्रमों के साथ स्थानांतरित करना संभव है?

(Emacs tramp-mode में फाइल को दूरस्थ रूप से संपादित करने के लिए यह सुविधा है)।

जवाबों:


48

के बजाय -oविकल्प जोड़ सकते हैं ।scp.ssh/config

scp -o ProxyCommand="ssh $jump_host nc $host 22" $local_path $host:$destination_path

$jump_host इस मामले में आपका "सर्वर बी" है।


ऐसा करने के लिए थि सी मेरा पसंदीदा तरीका है। यदि आप गेटवे से और सीधे एक ही होस्ट का उपयोग करते हैं, तो मल्टीशॉपिंग के लिए .ssh / config मेसेजिंग सबसे अच्छा समाधान नहीं है।
गैब्रिएलवी

यह अलग / कस्टम उपयोगकर्ता नाम और बंदरगाहों के साथ कैसे होगा?
पाब्लो ए

मैं यह कोशिश करता हूं और मुझे पासवर्ड डालना चाहिए। मैं इसे कैसे ठीक करूं। धन्यवाद।
जकार

44

OpenSSH को मानते हुए, अपने SSH कॉन्फ़िगरेशन को .ssh / config में जोड़ें

Host distant
ProxyCommand ssh near nc distant 22

यह SSH को निकट स्थित मशीन के माध्यम से निकटता से दूर नामित मशीन से "सीधे" कनेक्ट करने में सक्षम होने का कारण होगा। तब यह दूर की मशीन को scp और sftp जैसे अनुप्रयोगों का उपयोग कर सकता है।

इस काम के लिए आपको पास की मशीन पर स्थापित 'एनसी' उर्फ ​​नेटकैट की आवश्यकता होगी। लेकिन बहुत सारी आधुनिक प्रणालियों में यह पहले से ही होगा।

दो-शॉट समस्याओं के लिए टोव का टार समाधान अधिक प्रभावी है, यह मानते हुए कि आपने टार के सिंटैक्स और ऑपरेशन के नियमों को याद किया है।


यह वही तरीका है जो मैं उपयोग करता हूं ... इस उदाहरण में 'दूर' सर्वर C होगा और 'पास' स्पष्टीकरण के लिए सर्वर B होगा ...
जेरेमी बोस

बहुत सारी आधुनिक मशीनों में 'nc' नहीं है: यह आम तौर पर केवल लिनक्स मशीनों और केवल अनुरोध (मानक इंस्टॉल का हिस्सा नहीं) के लिए उपलब्ध है।
मेई

1
ssh के पास अब -W विकल्प है, जो स्वचालित रूप से 'nc' के बिना ऐसा करता है, लेकिन मुझे आश्चर्य है कि वहाँ
sc

3
मामले में मैं केवल यह स्पष्ट नहीं था: यदि उपयोगकर्ता नाम उपयोगकर्ता नाम nearसे अलग है distant, तो निकट उपयोगकर्ता में चला जाता है ProxyCommand ssh nearuser@near..., और दूर का उपयोगकर्ता एक अलग User distantuserलाइन में चला जाता है ।
म्यू माइंड

बस टाइप ssh बहु आशा और गूगल प्रेस मैं महसूस कर रहा हूँ भाग्यशाली
chandank

19

(B) मशीन के पास सर्वर पर ssh के अधिक हाल के संस्करणों के साथ, बिना नेटकैट के निम्नलिखित कार्य करेगा:

Host distant
    ProxyCommand ssh near -W distant:22

हालाँकि इसके लिए पास (B) मशीन पर Yes (डिफ़ॉल्ट) हाँ करने के लिए AllowTcpForwarding की आवश्यकता होगी

संपादित करें: B पर OpenSSH 5.4+ की आवश्यकता है


एक आकर्षण की तरह काम करता है :)
gongzhitaao

1
और बहुत कम से कम OpenSSH 7.4p1 के रूप में, एक "ProxyJump" कमांड है जिसमें किसी को केवल प्रत्येक उपयोगकर्ता @ होस्ट: पोर्ट को अल्पविराम से अलग करना है। अच्छा!
hmijail

ProxyJump अच्छा है, लेकिन यह कॉन्फ़िगर फ़ाइल से उपयोगकर्ता और पहचान नहीं ले पाया। ProxyCommand -W यह करता है और scp के साथ भी काम करता है।
रिकोफोसुसा

18

आप कुछ का उपयोग करके सर्वर B पर ssh कर सकते हैं

ssh -L 5022:<server C IP>:22 <user_serverB>@<server B IP>

तब आप सर्वर C का उपयोग करके ssh कर सकते हैं

ssh -p 5022 <user_serverC>@localhost 

इसी तरह एससीपी का उपयोग कर काम करेगा

scp -P 5022 foo.txt <user_serverc>@localhost:

याद रखें कि sc और ssh के साथ p का सही केस इस्तेमाल करें


5

यह संभव है और अपेक्षाकृत आसान है, तब भी जब आपको प्रमाणीकरण के लिए प्रमाण पत्र (AWS वातावरण में विशिष्ट) का उपयोग करने की आवश्यकता होती है।

नीचे दी गई कमांड सीधे आपके मशीन में remotePathऑन से फाइल कॉपी करेगी । आंतरिक रूप से scp अनुरोध के माध्यम से अनुमानित है ।server2localPathserver1

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

अन्य तरीके से भी काम करता है (फ़ाइल अपलोड करें):

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" <localpath> user2@server2:/<remotePath>

यदि आप इसके बजाय पासवर्ड प्रमाणीकरण का उपयोग करते हैं, तो प्रयास करें

scp -o ProxyCommand="ssh -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

यदि आप दोनों सर्वर में एक ही उपयोगकर्ता क्रेडेंशियल्स का उपयोग करते हैं:

scp -o ProxyCommand="ssh -W %h:%p commonuser@server1" commonuser@server2:/<remotePath> <localpath>

3

यदि आप वास्तव में दुष्ट होना चाहते हैं, तो आप चेन एसएचएस और टार, कुछ ऐसा tar c mydir | ssh server "ssh otherserver | tar x"कर सकते हैं , लेकिन यह समस्याओं के सभी हाथों में चला सकता है।

एसएसएच सुरंग का निर्माण करने का आसान तरीका एसएसएच की अंतर्निहित विधियों के साथ होगा; देखो -Dमैनपेज में स्विच और अन्य सर्वर के ssh बंदरगाह के लिए कुछ बंदरगाह अग्रेषित करें।


2

आप इसे उल्टा भी कर सकते हैं और शायद आसान है।

मान लें कि आपके पास एक ssh सत्र है जिसे आप उस मशीन के साथ खोलना चाहते हैं जिसे आप फ़ाइल भेजना चाहते हैं। यह सबसे दूर स्थित पीसी, हम इस हॉप 2 को कॉल करेंगे। आपका "प्रॉक्सी" होस्ट हॉप 1 होगा। पीसी जो फ़ाइल-मूल है, हम उस मूल को कॉल करेंगे।

origin:~/asdf.txt  --> hop1 --> hop2:~/asdf.txt

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

हॉप 2 पर:

ssh -R 5555:127.0.0.1:22 <hop1_user>@<hop1_IP>
#this has the effect of building a tunnel from hop2 to hop1, making hop2's port 22 available on hop1 as port 5555

अब उस ओपन टनल सेशन में आप हॉप 1 से फाइल_ऑरिगिन तक कर सकते हैं।

Hope1 पर:

ssh -R 6666:127.0.0.1:5555 <origin_user>@<origin_IP>
#this has the effect of building a tunnel from hop1 to origin while also pulling the active tunnel with it, making hop1's port 5555 (hop2's port 22) available on origin as port 6666.

अब आप हॉप 2 से लेकर हॉप 1 तक मूल के लिए तैयार हैं। संयोगवश, अब दोनों बंदरगाह 5555 और 6666 मूल पर खुले हैं, जो हॉप 2 के पोर्ट 22 पर पुनर्निर्देशित हैं। इस सत्र के भीतर, दोनों निम्नलिखित हॉप 2 के लिए मान्य एसपीपी मार्ग हैं:

मूल पर:

scp -P 6666 ~/asdf.txt <hop2_user>@<127.0.0.1>:~/asdf.txt

इस तरह, आप बीच में हॉप्स की कुछ मनमानी संख्या रख सकते हैं, और दो से अधिक हॉप्स को एक साथ चलाने के संदर्भ में काम करना आसान है।


1

एक सेटअप के लिए निम्न उदाहरण ओपनश कॉन्फिग को एडाप्ट करने का प्रयास करें जिसका उपयोग कई मेजबानों के लिए किया जा सकता है:

Host uat-*
     ProxyCommand ssh bastion-uat nc %h %p

यह उन सर्वरों का एक सेट मानता है जो "uat-" से शुरू होते हैं जो केवल जंपबॉक्स / गेटवे सर्वर "बैस्टियन-यूएटी" के माध्यम से सुलभ होते हैं। आप शायद यह भी जोड़ना चाहते हैं ForwardAgent yesकि क्या आप लॉगिन करने के लिए एक कुंजी का उपयोग कर रहे हैं।


इसके ForwardAgent yesलिए उपयोग न करें । एजेंट अग्रेषण इस मामले में आवश्यक नहीं है क्योंकि कोई एसएचएस ग्राहक गढ़ पर नहीं चल रहा होगा, और जब यह आवश्यक नहीं है तो एक एजेंट को अग्रेषित करना सुरक्षा को कम करने वाला है। और मुझे लगता sshहै कि आपकी आज्ञा से गायब है। यदि हाल के sshसंस्करण का उपयोग किया जा रहा है nc, तो आपको इसकी आवश्यकता नहीं है , आप ssh -W %h:%p bastion-uatइसके बजाय टाइप कर सकते हैं ।
कैस्परल्ड

@kasperd ssh को शामिल करने के लिए संपादित। री फॉरवर्डएजेंट; एक ssh क्लाइंट स्वयं nc कमांड चलाने के लिए चलेगा। शायद आप शेल का जिक्र कर रहे हैं?
बेंजामिन गुडाक्रे

1

यह scp नहीं है (जिसे ओपी ने अनुरोध किया था), लेकिन मुझे rsyncस्थानीय से लेकर दूरदराज तक एक ही हॉप पर कॉपी करने के लिए उपयोग करने के लिए यह सुपर सरल लगा :

rsync -v -e 'ssh -A -t user@jumpserver ssh -A -t user@destinationserver' /path/to/sourcefile :/path/to/destination

स्रोत: http://mjbright.blogspot.com/2012/09/using-rsync-over-multi-hop-ssh.html

मैंने ऊपर -o ProxyPass सुझाव की कोशिश की थी और अपनी बदलती जरूरतों के लिए कॉन्फ़िगर नहीं करना चाहता था। ऊपर दिए गए लिंक में लेखक के रूप में, गंतव्य फ़ाइल पूर्ववर्ती कॉलन (:) निर्दिष्ट पथ सर्वर पर पथ को इंगित करने के लिए महत्वपूर्ण है। इसके अलावा, rsync का उपयोग करते हुए, आपके पास तारीख की तुलना, फ़ोल्डर सिंक आदि के विकल्प हैं। मुझे आशा है कि यह किसी की मदद करता है!


-2

scp -o 'ProxyJump jumpboxname' somefilename.txt finaldestinationhost: / tmp /।


3
बस यहाँ अस्पष्टीकृत कोड का एक सा डंप मत करो। इस सवाल के बहुत सारे अच्छे उत्तर हैं और आपको मौजूदा लोगों के लिए मूल्य जोड़ने की आवश्यकता है - यह नहीं है।
स्वेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.