एक रिमोट सर्वर से दूसरे रिमोट सर्वर पर scp


15

मेरे पास सर्वर पर एक बड़ी फ़ाइल है oneऔर मैं इसे सर्वर twoका उपयोग करके कॉपी करना चाहता हूं scp। मेरे पास कुंजी सेटअप ठीक से है और मैं अपने डेस्कटॉप से ​​दोनों सर्वरों के लिए ssh / scp कर सकता हूं।

जिस फ़ाइल को मुझे कॉपी करने की आवश्यकता है वह मेरे वर्कस्टेशन के hdd पर मुफ्त स्पेस से बड़ी है, इसलिए मैं ऐसा करना चाहता था:

scp one:/opt/bigfile.tar.gz two:/opt/bigfile.tar.gz

लेकिन मुझे मिल गया:

ssh: Could not resolve hostname one: Name or service not known

हमारे यहां डीएनएस नहीं है (मुझसे पूछें क्यों नहीं), इसलिए मेरे पास यह मेरे ~ / .ssh / config में है:

Host one
    Hostname        <IP address of server one>
    User            jspurny

Host two
    Hostname        <IP address of server two>
    User            jspurny

यदि मैं एक छोटी फ़ाइल के साथ प्रयास करता हूं और इसे oneअपने कार्य केंद्र से और फिर इसे स्थानांतरित करता हूं two, तो यह ठीक काम करता है:

scp one:/opt/smallerfile.tar.gz .
scp smallerfile.tar.gz two:/opt/

टिप्पणी में सुझाए गए आईपी पते का उपयोग करते समय, मुझे मिला:

$ scp jspurny@<one's IP>:bigfile.tar.gz jspurny@<two's ip>:bigfile.tar.gz
Host key verification failed.
lost connection

कोई समस्या नहीं:

आकार यहां कोई समस्या नहीं है - यह इस समस्या के लिए केवल "ट्रिगर" था क्योंकि bigfile.tar.gzमेरे वर्कस्टेशन पर स्टोर करने का कोई तरीका नहीं था । समस्या फ़ाइल आकार की परवाह किए बिना होती है।

सवाल:

कमांड क्यों करता है:

scp oneremote:file secondremote:file

अगर .ssh/configएलियंस का उपयोग करते हुए या सीधे आईपी पते का उपयोग करते हुए एक त्रुटि होती है ?

हल - की तरह - अभी भी स्पष्टीकरण की तलाश में - मैंने बड़ी फाइल को छोटी फ़ाइलों में विभाजित किया है और उन्हें अपने कार्य केंद्र के माध्यम से एक-एक करके स्थानांतरित किया है। मैं अभी भी सोच रहा था कि यह काम क्यों नहीं किया। इसलिए मैं अभी भी कुछ स्पष्टीकरण की सराहना करूंगा कि क्या गलत था ..

एक कारण मिला कि यह विफल क्यों होता है: ऐसा लगता है कि मैं मूर्ख बन रहा था। मुझे लगा कि आज्ञा

scp one:file two:file

प्रत्येक सर्वर के लिए दो कनेक्शन बना रहा था और फिर एक से डेटा प्राप्त करता है और तुरंत उन्हें दो को भेजता है और इस प्रकार रिले की तरह काम करता है।

यह स्पष्ट रूप से मामला नहीं है, क्योंकि एक सरल -vविकल्प से पता चला है कि यह वास्तव में सिर्फ एक से जोड़ता है और एक से यह दो से जुड़ने की कोशिश करता है । जो स्पष्ट रूप से संभव नहीं है क्योंकि सर्वर एक को दो से कनेक्ट करने वाला नहीं है ।


क्या आपने "scp jspurny @ ip_address_server_one: /opt/bigfile.tar.gz jspurny @ ip_address_server_two :/opt/bigfile.tar.gz" जैसे आईपी पते का उपयोग करने के लिए बस अपने scp कमांड को बदलने की कोशिश की।

@ टोटचेस्टर: मैंने अभी किया था, लेकिन यह सिर्फ एक अलग त्रुटि देता है (संपादित प्रश्न देखें)
Jan Spurny


@ एसएलएम नहीं, मुझे आकार की कोई समस्या नहीं है।
जन स्पर्नी

जैसा कि मैंने त्रुटियों का स्पष्टीकरण पाया है, मैं इसे अपने स्वयं के उत्तर के रूप में जोड़ना / स्वीकार करना चाहता था, लेकिन यह मुझे थोड़ा अनुचित लगता है क्योंकि यह वास्तव में समस्या का समाधान नहीं करता है। क्या आपको लगता है कि मुझे इस प्रश्न पर पुनर्विचार करना चाहिए: रिले के रूप में अपने वर्कस्टेशन का उपयोग करके सर्वर एक से सर्वर दो में फाइल की प्रतिलिपि कैसे करें ? या मुझे उत्तर के रूप में उपयोग करने के लिए अपनी असमर्थता के बारे में अपनी व्याख्या जोड़नी चाहिए और इसे स्वीकार करना चाहिए?
Jan Spurny

जवाबों:


6

साधारण पाइप

इसे इस्तेमाल करे:

ssh one 'cat file' | ssh two 'cat > file'

पहले वाले को अपनी मशीन में फाइल कंटेंट भेजना चाहिए, जबकि दूसरे को दूसरी मशीन पर भेजना चाहिए। मैं यह सुनिश्चित करने के लिए स्थानांतरण के बाद दोनों सिरों पर एक चेकसम की गणना करूंगा, ताकि यह सुनिश्चित हो सके कि कुछ भी खो नहीं गया है या रास्ते में ही गड़बड़ा गया है।

विस्तृत सुरंगें

अधिक विस्तृत अनुप्रयोगों के लिए, आप ssh सुरंगों का उपयोग कर सकते हैं। उदाहरण के लिए, आप कुछ इस तरह की कोशिश कर सकते हैं:

ssh -R 5001:127.0.0.1:5002 one
ssh -L 5002:127.0.0.1:22 two

तो फिर तुम पर एक कनेक्शन खोल सकते हैं oneमशीन के लिए localhostबंदरगाह 5001और उसे दो बार भेजा जाएगा और पर एक कनेक्शन के रूप अंत twoकरने के लिए localhostबंदरगाह 22। यह ssh पोर्ट है, इसलिए आप इसका उपयोग अभी तक किसी अन्य scp, या rsync, या जो भी हो के लिए कर सकते हैं। आप 22 के बजाय एक rsyncसर्वर चालू कर सकते हैं twoऔर पोर्ट 873 को फॉरवर्ड कर सकते हैं। या आप ncदोनों पक्षों पर कच्चे डेटा को स्थानांतरित करने के लिए, एक मनमाना पोर्ट नंबर का उपयोग कर सकते हैं।

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


1
धन्यवाद! यह वही नहीं है जो मैं चाहता था , लेकिन मुझे वास्तव में जो चाहिए था , जो महान है।
Jan Spurny

16

इस उत्तर का पूरा श्रेय /superuser//a/602436/142948 को जाता है

आपको -3scp के विकल्प की आवश्यकता है :

scp -3 one:/opt/bigfile.tar.gz two:/opt/bigfile.tar.gz

-3: दो दूरस्थ मेजबान के बीच की प्रतियां स्थानीय होस्ट के माध्यम से स्थानांतरित की जाती हैं। इस विकल्प के बिना डेटा को सीधे दो दूरस्थ होस्ट के बीच कॉपी किया जाता है।

http://www.openbsd.org/cgi-bin/man.cgi?query=scp&sektion=1

अन्यथा दूसरा उपनाम "दो" मेजबान "एक" पर हल किया जा रहा है , जो मौजूद नहीं हो सकता है।


दुर्भाग्य से, यह विकल्प काफी नया प्रतीत होता है और सभी डिस्ट्रोस के लिए प्रचारित है।
व्हेरेस्वाल्डन

2

जब से तुम स्रोत सर्वर (एक) के लिए उपयोगकर्ता पहुँच क्यों लॉगिन नहीं और उस सर्वर पर अपने SCP आदेश चला सीधे ... आप चिंता करते हैं कि यह बहुत लंबा ले जाएगा, फिर कमांड एक के अंदर शुरू हो screenतो साथ स्क्रीन से अलग Ctrl+a dऔर इसे चलने दो।

हालाँकि, यदि आपको अपने कार्य केंद्र से ऐसा करना चाहिए , और स्रोत से गंतव्य सर्वर तक SSH कुंजी ठीक काम कर रही हैं, तो scpकमांड को कमांड के पैरामीटर के रूप में भेजें ssh, जैसे:

ssh user@source 'scp /path/to/file user@destination:/path/to/file'

धन्यवाद, यह निश्चित रूप से काम करेगा, उन सर्वरों को छोड़कर दोनों में पासवर्डअथेंटिकेशन अक्षम है और मैं एक से दूसरे में चाबियाँ नहीं जोड़ सकता हूं - उन्हें एक दूसरे से कनेक्ट करने में सक्षम नहीं होना चाहिए।
जन स्पर्नी

0

त्रुटि संदेश की खोज: "होस्ट कुंजी सत्यापन विफल हुआ।" यहाँ करने के लिए सबसे सीधी बात प्रतीत होगी। मुझे यह प्रश्नोत्तर पर प्रश्नोत्तर का शीर्षक मिला: SSH कनेक्शन समस्या "होस्ट कुंजी सत्यापन विफल ..." त्रुटि के साथ

उस प्रश्नोत्तर के उत्तर में से एक ने सुझाव दिया कि समस्या आपकी ~/.ssh/known_hostsफ़ाइल में परस्पर विरोधी प्रविष्टि के साथ झूठ बोलती है । आप या तो किसी पाठ संपादक का उपयोग करके उस फ़ाइल से परेशान प्रविष्टियों को हटा सकते हैं या आप प्रविष्टियों को हटाने के लिए इस आदेश का उपयोग कर सकते हैं:

$ ssh-keygen -R hostname

जहाँ hostnameया तो आईपी पता या सर्वर का नाम होगा जहाँ से आप जुड़ने का प्रयास कर रहे हैं। उपरोक्त सभी दो तरह से मेजबान होंगे ।


अगर मुझे समझ में नहीं आ रहा है तो मुझे यकीन नहीं है मैं किसी भी समस्या के बिना अपने वर्कस्टेशन से सर्वर और सर्वर पर ssh कर सकता हूँ .. समस्या तब शुरू होती है जब मैं वर्कस्टेशन से चलाता हूं । और एक या दो पर कोई फ़ाइल नहीं है । मैं बस के लिए कुंजी को दूर करने की कोशिश की दो (यहां तक कि के लिए एक सुनिश्चित करने के लिए) मेरे कार्य केंद्र लेकिन कुछ भी नहीं बदला पर (सिवाय के लिए क्या आप वाकई y / n हैं propt)। onetwoscp one:file two:fileknown_hosts
१४:५३ पर जन स्पर्नी

@JanSpurny - आपके वर्कस्टेशन का जिक्र इस Q में थोड़ा उलझा हुआ है, कम से कम मेरे लिए। जब आप कहते हैं कि आप अपने लैपटॉप / डेस्कटॉप से ​​मतलब रखते हैं। तो आप ऐसा कुछ कर रहे हैं जब आप कहते हैं कि यह "काम करता है": scp workstation:file one:fileऔर workstation:file two:file? स्पष्ट रूप से आपको "वर्कस्टेशन: फ़ाइल" कहने की ज़रूरत नहीं है, मैं सिर्फ यह कह रहा हूं कि यह बातचीत के लिए स्पष्ट रूप से है।
स्लम

अच्छी तरह से मैं यह उल्लेख करता हूं कि मैंने अपने कार्य केंद्र से सभी कमांड चलाए। तो यह अधिक पसंद था: workstation$ scp one:file fileऔर workstation$ scp file two:file। वैसे भी, मुझे लगता है कि मैंने इसे हल कर लिया है। मैं इसे अपने जवाब के रूप में जोड़ूंगा।
Jan Spurny

@ जानपर्णी - ठीक है, खुशी है कि तुमने इसका पता लगाया। सवाल के लिए धन्यवाद BTW!
स्लम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.