सवाल मैं मल्टीहोप एससीपी स्थानान्तरण कैसे करूं?


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

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

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


76
2017-07-08 12:09


मूल




जवाब:


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

Host distant
ProxyCommand ssh near nc distant 22

इससे एसएसएच निकटतम मशीन के माध्यम से प्रॉक्सी करके दूर की गई मशीन पर "सीधे" कनेक्ट करने में सक्षम हो जाएगा। इसके बाद यह दूरस्थ मशीन पर एसपीपी और एसएफटीपी जैसे अनुप्रयोगों का उपयोग कर सकता है।

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

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


43
2017-07-08 12:25



यह वही तरीका है जिसका मैं उपयोग करता हूं ... इस उदाहरण में 'दूरस्थ' सर्वर सी होगा और 'पास' स्पष्टीकरण के लिए सर्वर बी होगा ... - Jeremy Bouse
बहुत सी आधुनिक मशीनों में 'एनसी' नहीं है: यह आमतौर पर केवल लिनक्स मशीनों के लिए उपलब्ध होता है और केवल अनुरोध (मानक स्थापना का हिस्सा नहीं)। - Mei
एसएसएच अब -W विकल्प है, जो स्वचालित रूप से 'एनसी' के बिना करता है, लेकिन मुझे आश्चर्य है कि एसपीपी-डब्ल्यू क्यों नहीं है - kubanczyk
यदि मैं अकेला नहीं हूं तो यह स्पष्ट नहीं था: यदि उपयोगकर्ता नाम पर near उपयोगकर्ता नाम से अलग है distant, निकट उपयोगकर्ता अंदर जाता है ProxyCommand ssh nearuser@near..., और दूर उपयोगकर्ता एक अलग में चला जाता है User distantuser लाइन। - Mu Mind
बस ssh बहु आशा टाइप करें और Google दबाएं मैं भाग्यशाली महसूस कर रहा हूं - chandank


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

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

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


41
2018-01-11 17:30



यह करने के लिए मेरा पसंदीदा तरीका था। मल्टीहोपिंग के लिए .ssh / config को गड़बड़ करना सबसे अच्छा समाधान नहीं है यदि आप एक ही गेटवे से सीधे और सीधे होस्ट तक पहुंचते हैं। - GabrieleV
महान स्निपेट ... धन्यवाद ... - Paul T.
यह अलग / कस्टम उपयोगकर्ता नाम और बंदरगाहों के साथ कैसे होगा? - Pablo Bianchi


(बी) मशीन के पास सर्वर पर एसएसएच के हाल के संस्करणों के साथ निम्नलिखित नेटकैट के बिना काम करेगा:

Host distant
    ProxyCommand ssh near -W distant:22

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

संपादित करें: बी पर ओपनएसएसएच 5.4+ की आवश्यकता है


19
2018-03-20 01:04



एक जादू की तरह काम करता है :) - gongzhitaao
और ओपनएसएसएच 7.4 पी 1 के रूप में कम से कम, एक "प्रॉक्सीजंप" कमांड होता है जिसमें एक को केवल प्रत्येक उपयोगकर्ता @ होस्ट: पोर्ट को अल्पविराम से अलग करना होता है। अच्छा! - hmijail
प्रॉक्सीजंप अच्छा है, लेकिन यह कॉन्फ़िगरेशन फ़ाइल से उपयोगकर्ता और पहचान फ़ील्ड नहीं लेता है। ProxyCommand -W यह करता है और एसपीपी के साथ भी काम करता है। - rickfoosusa


आप कुछ बी का उपयोग कर सर्वर बी के लिए ssh कर सकते हैं

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

फिर आप सर्वर सी का उपयोग कर एसएस कर सकते हैं

ssh -p 5022 <user_serverC>@localhost 

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

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

एसपीपी और एसएसएच के साथ पी के सही मामले का उपयोग करना याद रखें


15
2017-07-08 13:02





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

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


3
2017-07-08 12:16





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

नीचे दिया गया आदेश एक से फाइल कॉपी करेगा remotePath पर server2 सीधे अपनी मशीन में localPath। आंतरिक रूप से एसपीपी अनुरोध के माध्यम से प्रॉक्सी किया जाता है server1

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>

2
2017-10-08 01:24





आप इसे विपरीत में भी कर सकते हैं और शायद आसान हो सकता है।

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

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

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

Hop2 पर:

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

अब उस खुले सुरंग सत्र में, आप hop1 से file_origin तक ऐसा कर सकते हैं।

आशा 1 पर:

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.

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

उत्पत्ति पर:

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

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


2
2017-11-18 20:22





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

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

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


1
2018-06-25 10:33



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


यह एसपीपी नहीं है (जिसे ओपी ने अनुरोध किया), लेकिन मुझे इसका उपयोग करने के लिए बहुत आसान लगता है 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

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


1
2017-12-21 17:07