rsync हैक दो असंबद्ध सर्वरों के बीच फ़ाइलों को बाउंस करने के लिए


8

यहाँ कनेक्शन है:

[Server1] <---> [my desktop] <---> [Server2]

Server1 और server2 को प्रत्येक अभिभावक से सीधे बात करने की अनुमति नहीं है (पूछें नहीं)। मेरा डेस्कटॉप, हालांकि ssh के माध्यम से दोनों सर्वर तक पहुंचने में सक्षम है।

मुझे सर्वर 1 से सर्वर 2 तक फ़ाइलों को कॉपी करने की आवश्यकता है।

ट्रैडिशनल रूप से मैं ssh + tar हैक का उपयोग कर रहा हूं, जैसे:

ssh -q root@Server1 'tar -vzc /path/to/files ' | ssh -q root@Server2 'tar -vzx -C /'

और यह बहुत अच्छा काम करता है, लेकिन मैं इसे एक कदम आगे ले जाना चाहूंगा और दो सर्वरों के बीच rsync काम करूंगा।

अब मुझे पता है कि मैं एक टर्मिनल में ssh पोर्ट-फ़ॉरवर्ड टनल शुरू कर सकता हूं और फिर दूसरी विंडो में उस टनल पर rsync कर सकता हूं, लेकिन मैं दूसरे टर्मिनल के साथ फ़्यूज़ नहीं करना चाहता और एक अलग पोर्ट फ़ॉरवर्ड टनल बनाना या तोड़ना चाहता हूं। मुझे क्या चाहिए:

  • एक लाइनर कमांड सर्वरों से सर्वर 1 से सर्वर 2 वीआईए मेरे डेस्कटॉप पर rsync करने के लिए
  • सभी एक कमांड लाइन, एक टर्मिनल विंडो पर
  • मैं चाहता हूं कि पोर्ट फॉरवर्ड सुरंग केवल rsync कमांड के जीवन के लिए मौजूद हो।
  • मैं scp नहीं करना चाहता, मैं rsync करना चाहता हूं।

किसी को भी करने के लिए एक चाल है?

संपादित करें: यहाँ काम कर रहा है! महान काम हर कोई: 1. rsa कुंजी पथ के लिए, tildae का उपयोग नहीं कर सकता, "/ root /" का उपयोग करना पड़ा। 2. यहाँ अंतिम कमांडलाइन है:

ssh -R 2200:SERVER2:22 root@SERVER1 "rsync -e 'ssh -p 2200 -i /root/.ssh/id_rsa_ROOT_ON_SERVER2' --stats --progress -vaz /path/to/big/files root@localhost:/destination/path"

डायनामाइट भड़ाम से फटता है।


यह वास्तव में उत्कृष्ट है। एक चीज जिसे बदलने की आवश्यकता है वह है होस्ट कुंजी सत्यापन अक्षम करना। TTYless प्रमाणीकरण के लिए आपके पास SSH कुंजी है, लेकिन चूंकि सर्वर ने कभी एक दूसरे से बात नहीं की है, वे मेजबान कुंजी को सत्यापित नहीं कर सकते हैं। तो इसे निष्क्रिय करने के लिए सबसे अच्छा है: -o StrictHostKeyChecking = -p या -i झंडे के बाद नहीं।
अमाला

जवाबों:


5

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

#!/bin/sh
rsync user@server1:/path/to/stuff /path/to/loca/copy -a --delete --compress
rsync /path/to/loca/copy user@server2:/path/to/where/stuff/should/go -a --delete --compress

एक सरल स्क्रिप्ट का उपयोग करने का मतलब है कि आपने सब कुछ करने के लिए एकल कमांड को वांछित किया है। यदि डेटा संवेदनशील है (तो आप या आपकी कंपनी के अन्य लोग, आपके लैपटॉप पर इधर-उधर तैरने वाली कॉपी नहीं चाहते हैं) तो यह निश्चित रूप से एक सुरक्षा नहीं-नहीं हो सकता है। यदि सर्वर 1 आपके लिए स्थानीय है, तो आप बाद में स्थानीय कॉपी को हटा सकते हैं (क्योंकि यह हर बार स्थानीय लैन पर पुनर्निर्माण करने के लिए त्वरित होगा)।

एक सुरंग का निर्माण करना ताकि सर्वर प्रभावी रूप से एक दूसरे से बात कर सकें और अधिक संभव हो सके जैसे कि:

  1. सर्वर 2 पर / बिन / श की एक प्रति / usr / स्थानीय / बिन / shforkeepalive बनाते हैं। एक कॉपी के बजाय एक प्रतीकात्मक लिंक का उपयोग करें, फिर आप इसे पैच / बिन / श के सुरक्षा अपडेट के बाद अपडेट नहीं करना है।
  2. सर्वर 2 पर एक ऐसी स्क्रिप्ट बनाएं जिसमें कुछ सेकंड के लिए लूप स्लीपिंग के अलावा कुछ नहीं होता है, फिर थोड़ी मात्रा में टेक्स्ट आउट की गूंज होती है, और इसमें अभी sh की "कॉपी" का उपयोग होता है:

    #!/usr/local/bin/shforkeepalive
    while [ "1" != "0" ]; do
            echo Beep!
            sleep 5
    done
    

    ( echoशायद इसकी जरूरत नहीं है, क्योंकि सत्र काफी समय से बेकार नहीं जा रहा है, भले ही एसएसएचडी को एसश क्लाइंट से जिंदा पैकेट को अनदेखा करने के लिए कॉन्फ़िगर किया गया हो)

  3. अब आप अपने लैपटॉप पर एक स्क्रिप्ट लिख सकते हैं जो पृष्ठभूमि में आपकी रिवर्स सुरंग शुरू करता है, सर्वर 1 को कॉपी ऑपरेशन करने के लिए rsync का उपयोग करने के लिए कहता है, फिर लूपिंग स्क्रिप्ट को मारकर रिवर्स सुरंग को मारता है (जो एसएसएच सत्र बंद कर देगा):

    #!/bin/sh
    ssh user@server2 -L2222:127.0.0.1:22 /usr/local/bin/keepalivesctipt &
    ssh user@server1 -R2222:127.0.0.1:2222 rsync /path/to/stuff user@127.0.0.1:/destination/path/to/update -a --delete --compress -e 'ssh -p 2222'
    ssh user@server2 killall shforkeepalive
    

जिस तरह से यह काम करता है:

  • पंक्ति 1: मानक "कमांड इस स्क्रिप्ट की व्याख्या करने के लिए उपयोग करने के लिए" मार्कर
  • पंक्ति 2: रिवर्स सुरंग के साथ एक SSH कनेक्शन शुरू करें और इसे खुला रखने के लिए इसके माध्यम से रखने योग्य स्क्रिप्ट चलाएँ। अनुगामी & bash को पृष्ठभूमि में इसे चलाने के लिए कहता है ताकि अगली पंक्तियाँ समाप्त होने की प्रतीक्षा किए बिना चल सकें
  • पंक्ति 3: एक सुरंग शुरू करें जो कि सर्वर से ऊपर सुरंग से जुड़ेगी इसलिए server1 को देख सकते हैं, और इस व्यवस्था पर प्रतिलिपि / अद्यतन करने के लिए rsync चलाएं
  • पंक्ति 4: rsync ऑपरेशन पूरा होने पर (और इसलिए दूसरा SSH कॉल रिटर्न), जो पहले ssh सत्र को पूरा करेगा, कीप-लिपि स्क्रिप्ट को मारें।

यह विशेष रूप से साफ महसूस नहीं करता है, लेकिन यह काम करना चाहिए। मैंने उपरोक्त परीक्षण नहीं किया है इसलिए आपको इसे ट्विक करने की आवश्यकता हो सकती है। सर्वर 1 पर rsync कमांड को सिंगल लाइन स्क्रिप्ट बनाने से 'ssh' कॉलिंग कमांड पर वर्णों से बचने की किसी भी आवश्यकता को कम करने में मदद मिल सकती है।

BTW: आप कहते हैं "मत पूछो" क्यों दो सर्वर एक दूसरे को सीधे नहीं देख सकते हैं, लेकिन इसके लिए अक्सर अच्छा कारण है। मेरा होम सर्वर और सर्वर जिस पर ऑनलाइन बैकअप होता है, वे एक-दूसरे को लॉगिन नहीं कर सकते हैं (और सभी उपयोगकर्ताओं के लिए अलग-अलग पासवर्ड + कुंजियाँ हैं) - इसका मतलब है कि यदि दोनों में से किसी एक को हैक किया जाता है तो इसे एक आसान मार्ग के रूप में उपयोग नहीं किया जा सकता है दूसरे को हैक करें ताकि मेरे ऑनलाइन बैकअप सुरक्षित हों (कोई व्यक्ति मेरे डेटा को लाइव से हटाने के लिए दुर्भावनापूर्ण तरीके से बैकअप बैकअप को अपडेट करने की अपनी क्षमता का उपयोग नहीं कर सकता, क्योंकि इसमें मुख्य बैकअप साइट को छूने की कोई सीधी क्षमता नहीं है)। दोनों सर्वर दोनों एक इंटरमीडिएट सर्वर से कनेक्ट कर सकते हैं - लाइव सर्वर अपने बैकअप को (rsync के माध्यम से) सुबह-सुबह इंटरमीडिएट मशीन को पुश करने के लिए सेट है और कनेक्ट करने के लिए बैकअप सर्वर सेट किया गया है (थोड़ी देर बाद चरण एक को पूरा करने के लिए) और बैकअप एकत्र करें (फिर से rsyc के माध्यम से एक स्नैपशॉट कदम के बाद बैकअप के कई उम्र बनाए रखने के लिए)। यह तकनीक आपकी परिस्थिति में भी उपयोग करने योग्य हो सकती है, और यदि ऐसा है तो मैं इसे बहुत साफ-सुथरे तरीके से करने की सलाह दूंगा।

संपादित करें: हारून के साथ मेरी हैकिंग को विलय करना / सभी के बारे में / बिन / श की प्रतियां और सर्वर 2 पर एक अलग रखने वाली लिपि से बचने के लिए, इस स्क्रिप्ट को आपके लैपटॉप पर पूरी नौकरी करनी चाहिए:

#!/bin/sh
ssh user@server2 -L2222:127.0.0.1:22 sleep 60 &
pid=$!
trap "kill $pid" EXIT 
ssh user@server1 -R2222:127.0.0.1:2222 rsync /path/to/stuff user@127.0.0.1:/destination/path/to/update -a --delete --compress -e 'ssh -p 2222'

जैसा कि ऊपर कहा गया है, rsync लोकलहोस्ट से जुड़ रहा है: 2222 जो आपके लैपटॉप की लोकलहोस्ट के लिए सुरंग के नीचे है: 2222 जो कि दूसरी सुरंग के माध्यम से सर्वर 2 के लोकलहोस्ट: 22 में जाता है।

संपादित करें 2: यदि आपको सर्वर 1 से कोई फर्क नहीं पड़ता है, तो यह सर्वर 2 के साथ सीधे प्रमाणित करने की अनुमति देता है (भले ही यह बिना सुरंग के सर्वर 2 को नहीं देख सकता) आप इसके साथ और भी सरल कर सकते हैं:

#!/bin/sh
ssh user@server1 -R2222:123.123.123:22 rsync /path/to/stuff user@127.0.0.1:/destination/path/to/update -a --delete --compress -e 'ssh -p 2222'

जहां 123.123.123.123 सर्वर 2 के लिए एक सार्वजनिक पता है, जिसे स्क्रिप्ट की बजाय कॉपी-पेस्ट वन-लाइनर के रूप में इस्तेमाल किया जा सकता है।


यह बड़ी मात्रा में डेटा (20 + जीबी) है और मैं इसे स्थानीय स्तर पर संग्रहीत करने के बजाय एक ही समय में और बाहर स्ट्रीम करना पसंद करता हूं। मैं कुछ भी संग्रहीत किए बिना अपने पीसी के माध्यम से डेटा को स्ट्रीम करना चाहता हूं। आप "मत पूछो" के बारे में सही हैं, यह अच्छे कारण के लिए है, भले ही एक चिता हो।
नियमित

प्लेसी ने मूल प्रश्न पर नए संपादन देखें
नियमित

मुझे लगता है कि टाइमस्टैम्प के अनुसार आपकी टिप्पणी से पहले मेरा अंतिम संपादन (पोस्ट किए गए सेकंड) इसलिए हम संभवतः उसी समय टाइप कर रहे थे) आपको वह वन-लाइनर दे सकता है जिसकी आपको तलाश है।
डेविड स्पिललेट

हुर्रे !!! यह काम करता हैं! 1. rsa कुंजी के लिए, tildae का उपयोग नहीं कर सकते हैं, "/ root /" का उपयोग करना था। 2. यहाँ अंतिम कमांडलाइन है:ssh -R 2200:SERVER2:22 root@SERVER1 "rsync -e 'ssh -p 2200 -i /root/.ssh/id_rsa_ROOT_ON_SERVER2' --stats --progress -vaz /path/to/big/files root@localhost:/destination/path"
नियमित

हाय @ डेविड, इस बेहतरीन हैक के लिए धन्यवाद। हालांकि, इसे काम करने के लिए, मुझे दोनों समाधानों का उपयोग करके सर्वर 1 पर सर्वर 2 की कुंजी की आवश्यकता है (पहले और दूसरे संस्करण में)। मुझे लगता है कि यह सामान्य है (पोर्ट अग्रेषण या नहीं, सर्वर 1 अभी भी सर्वर 2 को प्रमाणित करने की कोशिश कर रहा है), लेकिन आप लिखते हैं If you don't mind server1 having a key ...। क्या आप मुझे बता सकते हैं कि क्या सर्वर 1 पर कृपया सर्वर 2 की कुंजी रखने से बचना संभव है?
ssssteffff

2

यहां कुछ तरीके दिए गए हैं जो सिंक्रोनाइज़ेशन को एक साधारण लाइनर बनाते हैं, लेकिन कुछ सेटअप कार्य की आवश्यकता होती है।

  • अपने डेस्कटॉप पर server1 से एक रिवर्स ssh टनल सेट करें (क्षमा करें, मैं आपको .ssh/configमेरे सिर के ऊपर से झुकाव नहीं बता सकता )। अपने डेस्कटॉप से ​​सर्वर 2 के कनेक्शन के साथ इसे चेन करें। सर्वर 1 से rsync चलाएँ।

  • अपने डेस्कटॉप पर एक मोजे प्रॉक्सी (या एक HTTP प्रॉक्सी जो कॉन्सेप्ट स्वीकार करता है) सेट करें। सर्वर 1 से सर्वर 2 तक ssh कनेक्शन स्थापित करने के लिए इसका उपयोग करें। सर्वर 2 से rsync चलाएँ।

  • Rsync के बजाय unison का उपयोग करें । लेकिन वर्कफ़्लो अलग है।

  • Sshfs का उपयोग करके अपने डेस्कटॉप पर एक या दोनों सर्वर से निर्देशिकाओं को माउंट करें ।


1

एक पंक्ति क्यों? एक छोटी सी शेल स्क्रिप्ट का उपयोग करें:

#!/bin/bash
# Run me on server1

# Create the port forward server1 -> desktop -> server2 (i.e.
# the first forward creates a second tunnel running on the desktop)
ssh -L/-R ... desktop "ssh -L/-R ... server2 sleep 1h" &    
pid=$!

# Kill port forward process on exit and any error
trap "kill $pid" EXIT 

rsync -e ssh /path/to/files/ root@localhost:/path/to/files/on/server2

IIRC, आप नींद के समय को कम कर सकते हैं; sshजब तक कोई चैनल का उपयोग नहीं करेगा तब तक पहला समाप्त नहीं होगा।


मुझे पूरा यकीन है कि rsync SSH के ऊपर दो रिमोट सर्वर के बीच काम नहीं कर सकता है (केवल स्थानीय-> रिमोट या रिमोट-> लोकल) - हालाँकि आपका उपयोग sleepऔर trapमेरे उत्तर में "जीवित और मार डालो" विधि की तुलना में शून्य है। ।
डेविड स्पिललेट 13

कृपया मूल प्रश्न पर संपादन देखें।
रेग्युलेटरे

धिक्कार है, तुम सही हो। यह कमांडिंग पर दो मेजबानों को तर्क के रूप में निर्दिष्ट करने की अनुमति नहीं है। ...
हम्मम

ठीक है, मैंने अपने समाधान में सुधार किया है। सर्वर 1 पर दिखाई देने वाली सर्वर 2 की ssh सेवा को बनाने के लिए आपको दो पोर्ट फॉरवर्ड बनाने होंगे।
आरोन दिगुल्ला

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