कैसे दो remotes के बीच rsync फ़ाइलों को?


54

मैं स्थानीय शेल का उपयोग करके दो दूरस्थ होस्ट के बीच फ़ाइलों को स्थानांतरित करना चाहूंगा, लेकिन ऐसा लगता है कि rsync तुल्यकालन का समर्थन नहीं करता है यदि दो रीमोट निम्नानुसार निर्दिष्ट हैं:

$ rsync -vuar host1:/var/www host2:/var/www
The source and destination cannot both be remote.

इसी तरह के परिणाम प्राप्त करने के लिए मैं अन्य कौन से वर्कअराउंड / कमांड का उपयोग कर सकता हूं?



1
वास्तव में आप 3 मेजबान पर sshfs का लाभ उठाकर 2 दूरस्थ होस्ट के बीच rsync कर सकते हैं। मेजबान 3 पर host1 और host2 को माउंट करने के लिए बस sshfs का उपयोग करें। फिर 1 और 2. के बीच rsync
विलियम लेग

@WilliamLegg का उपयोग करने के साथ नुकसान sshfsयह है कि तब rsyncस्रोत और गंतव्य फाइल सिस्टम दोनों को स्थानीय के रूप में देखता है, इसलिए यह अपने डेल्टा एल्गोरिदम को निष्क्रिय कर देता है। उस बिंदु पर आप लगभग केवल उपयोग कर सकते हैं cp -p। देखें जवाब था कि यह प्रस्ताव और इसके बाद के टिप्पणी नहीं।
रोइमा

जवाबों:


50

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

के बजाय

rsync -vuar host1:/var/www host2:/var/www

आप इसका उपयोग कर सकते हैं

ssh -R localhost:50000:host2:22 host1 'rsync -e "ssh -p 50000" -vuar /var/www localhost:/var/www'

यदि आप सोच रहे हैं, तो -Rविकल्प host1 पर पोर्ट 50000 से एक रिवर्स चैनल सेट करता है जो मैप्स (आपके स्थानीय मशीन के माध्यम से) host2 पर 22 पोर्ट के लिए है। Host1 से host2 का कोई सीधा संबंध नहीं है।


1
मुझे @ रोइमा का समाधान पसंद है, लेकिन मैं इसे विभिन्न कारणों से मेरे लिए काम नहीं कर पाया। अंत में मैं sshfsदोनों दूरस्थ निर्देशिकाओं को स्थानीय रूप से माउंट करता था, फिर rsyncस्थानीय स्तर पर दो निर्देशिकाओं का उपयोग करता था।
असिस्टेंट

एक उदाहरण का उपयोग करना संभव है जहां एक कुंजी का उपयोग किया जाता है? -iSsh कमांड के लिए आवश्यक कुंजियों को निर्दिष्ट करने के लिए उपयोग करने के तरीके का पता लगाने में समस्या हो रही है ।
onassar

@onassar कमांड के -i key...बाद कोटर्स के अंदर पैरामीटर जोड़ें ssh। अगर इससे आपको कोई नया प्रश्न पूछने में
संकोच

1
रिवर्स कनेक्ट स्थानीय पक्ष पर ~ / .ssh / config नहीं पढ़ता है - कुछ का उपयोग करने की आवश्यकता है जिसे हल किया जा सकता है जैसे कि कोई SSH कॉन्फ़िगरेशन फ़ाइल नहीं थी
Florenz Kley

1
'मान लिया जाए कि दो सर्वर एक दूसरे से सीधे बात नहीं कर सकते।' यह समाधान एक फ़ायरवॉल या NAT समस्या के आसपास काम करता है जो एक प्रत्यक्ष SSH कनेक्शन को रोकता है । हालाँकि, यह उस मामले को संबोधित नहीं करता है जहां सुरक्षा कारणों से स्रोत उपयोगकर्ता (होस्ट 1 पर) के पास गंतव्य पर कोई कुंजी या क्रेडेंशियल या अपर्याप्त लेखन अनुमतियाँ नहीं हैं। इसके लिए केविन कॉक्स का समाधान देखें, या स्क्रिप्ट का उपयोग करके अप्रत्यक्ष कनेक्शन का सहारा लें scp -3
सेड्रिक नाइट

22

आपने यह नहीं कहा कि आप एक होस्ट में लॉग इन क्यों नहीं करना चाहते हैं और फिर दूसरे को कॉपी करें ताकि मैं अपने कारणों और समाधानों में से एक साझा करूं।

मैं एक मशीन में तो दूसरे के लिए rsync लॉग नहीं कर सकता क्योंकि न तो मेजबान के पास SSH कुंजी थी जो दूसरे में लॉग इन कर सकती थी। जब मैंने लॉगिन किया था तो मैंने अपने SSH कुंजी का उपयोग करने के लिए पहले होस्ट को अनुमति देने के लिए SSH एजेंट का उपयोग करके इसे हल किया।

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

निम्न कमांड SSH एजेंट का उपयोग करेगा जिससे कि सीधा कनेक्शन खोला जा host1सके host2। इससे यह फायदा होता है कि कमांड चलाने वाली मशीन ट्रांसफर में अड़चन नहीं डालती है।

ssh -A host1 rsync -vuar /var/www host2:/var/www

3
एक वैध उपयोग के मामले को समझाने के लिए +1 (जहां होस्ट 1 पर दूरस्थ उपयोगकर्ता को गंतव्य सर्वर पर कोई अनुमति नहीं है); महत्वपूर्ण सुरक्षा चेतावनी के लिए ( मुख्य प्रतिबंधों के बजाय नेटवर्क के आसपास जाने के -Dबजाय पोर्ट अग्रेषण का उपयोग करें -A); फायदा समझाने के लिए; कमांड छोटा होने के लिए; और यह वास्तव में काम कर रहा है। ध्यान दें कि आपको username@host1यह निर्दिष्ट करने की आवश्यकता हो सकती है कि क्या यह स्थानीय उपयोगकर्ता नाम से अलग है। यह भी कि rsync host2 से कनेक्ट होने पर होस्ट कुंजी सत्यापन करता है, इसलिए host1 की कुंजी पहले से ही होनी चाहिए। host2 पर .ssh / ज्ञात_होस्ट या कमांड विफल हो जाएगी।
सेड्रिक नाइट

घटना का जवाब, इससे मुझे टीमसिटी में कुछ चीजों को ऑर्केस्ट्रेट करने में मदद मिली जो मैं पहले नहीं कर पाया था (अन्य टीमसिटी उपयोगकर्ताओं के लिए नायब, आपको "एसएसएच एजेंट" नामक "बिल्ड फ़ीचर" का उपयोग करने से पहले अपने बिल्ड कॉन्फ़िगरेशन में जोड़ना होगा ssh -A, संगम देखें । jetbrains.com/display/TCD10/SSH+Agent )।
जॉन Zwinck

12

मुझे रोइमा का जवाब पसंद है, लेकिन रास्ते दोनों उदाहरणों में समान हैं, अस्पष्ट है जो कि है। हमने स्थापित किया है कि निम्नलिखित काम नहीं करता है:

rsync -vuar host1:/host1/path host2:/host2/path

लेकिन ऐसा होता है (मैंने स्थानीयहोस्ट के स्पष्ट bind_address को -Rविकल्प से हटा दिया है क्योंकि यह डिफ़ॉल्ट है):

ssh -R 50000:host2:22 host1 'rsync -e "ssh -p 50000" -vuar /host1/path localhost:/host2/path'

ध्यान दें कि होस्ट 1 पर निजी कुंजी और host2 पर सार्वजनिक कुंजी के साथ आपको दो दूरस्थ मेजबानों के बीच सही तरीके से सेट की गई चाबियां रखनी होंगी।

कनेक्शन को डीबग करने के लिए, इसे दो भागों में तोड़ें और वर्बोज़ स्थिति जोड़ें:

localhost$ ssh -v -R 50000:host2:22 host1

यदि यह काम करता है, तो आपके पास host1 पर एक शेल होगा। अब host1 से rsync कमांड आज़माएं। मैं इसे एक अलग विंडो में करने की सलाह देता हूं ताकि क्रिया ssh जानकारी rsync स्थिति जानकारी के साथ मिश्रित न हो:

host1$ rsync -e "ssh -p 50000" -vuar /host1/path localhost:/host2/path

मेरे उदाहरण में रास्ते स्रोत, गंतव्य हैं। यह rsynchost1 पर host2 पर लक्ष्य के साथ शुरू किया गया है। (आप एक टिप्पणी में स्पष्टीकरण के लिए पूछ सकते थे।)
रोइमा

1
मैंने टिप्पणी की होगी, लेकिन आप 50+ की प्रतिष्ठा के बिना किसी और की पोस्ट पर टिप्पणी नहीं कर सकते ।
ज्येब्रा

7

बैश स्क्रिप्ट सिंटैक्स में रोएमा द्वारा जवाब सुधारना (और स्पष्टता के लिए लाइन निरंतरता वर्णों को जोड़ना) मैंने अनियमित रूप से पोर्ट 22000 को चुना ...

SOURCE_USER=user1
SOURCE_HOST=hostname1
SOURCE_PATH=path1

TARGET_USER=user2
TARGET_HOST=host2
TARGET_PATH=path2

ssh -l $TARGET_USER -A -R localhost:22000:$TARGET_HOST:22 \
$SOURCE_USER@$SOURCE_HOST "rsync -e 'ssh -p 22000' -vuar $SOURCE_PATH \
$TARGET_USER@localhost:$TARGET_PATH"

1
यह मुझे लगता है कि आपने जो कुछ भी किया है, वह अपने मनमाने होस्टनामों को चर के साथ बदल रहा है?
जेफ स्कालर

3
हाँ, मैंने किया। यह मेरे लिए स्पष्टता जोड़ता है कि स्रोत मशीन कौन सी है, जो लक्ष्य है, और स्रोत और लक्ष्य पथ कहाँ जाते हैं। मुझे यह सब काम करने में थोड़ी देर लगी और यह साधारण प्लेसहोल्डर होस्टनाम से स्पष्ट नहीं था।
डेविड आई।

अगली बार कृपया बेझिझक इसे संपादित करके किसी और के उत्तर को बेहतर बनाएं।
रोइमा

यह जवाब मेरे लिए समाधान था क्योंकि यह रिवर्स सुरंग (-R) के साथ ssh- एजेंट फॉरवर्डिंग (-ए) को जोड़ती है।
कैम्टेलहेमेल

3

आदर्श तरीका rsyncउन सर्वरों में से एक पर चलना होगा । लेकिन अगर आप रिमोट सर्वर पर स्क्रिप्ट नहीं चलाना चाहते हैं। आप अपने स्थानीय सिस्टम पर एक स्क्रिप्ट चला सकते हैं और एक ssh कर सकते हैं और वहां rsync निष्पादित कर सकते हैं।

ssh user@$host1 <<ENDSSH >> /tmp/rsync.out 2>&1 rsync -vuar /var/www host2:/var/www ENDSSH

इसके अलावा, जैसा कि आप शायद जानते हैं rysnc एक तरह से सिंक्रनाइज़ेशन करता है। यदि आप दो तरह से सिंक्रनाइज़ेशन चाहते हैं, तो आप osync ( https://github.com/deajan/osync ) पर देख सकते हैं । मैंने इसका इस्तेमाल किया और इसे मददगार पाया।


0

अतिरिक्त जानकारी के रूप में:

यदि आप अन्य दो मशीनों को जोड़ने के लिए जंप होस्ट का उपयोग करते हैं, लेकिन वे सीधे एक दूसरे तक नहीं पहुंच सकते हैं, तो आप इन दो मशीनों के बीच माध्यम के रूप में sshfs का उपयोग कर सकते हैं, जैसे (जंप होस्ट पर):

$ mkdir ~/sourcepath ~/destpath
$ sshfs sourcehost:/target/dir ~/sourcepath
$ sshfs desthost:/target/dir ~/destpath
$ rsync -vua ~/sourcepath ~/desthpath

SSHFS जंप होस्ट पर दो रास्ते प्रदान करता है और rsync हमेशा की तरह फ़ाइलों के सिंक्रनाइज़ेशन का प्रबंधन करता है (बस अंतर के साथ यह स्थानीय रूप से किया जाता है)।


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

0

आप एक कंप्यूटर पर एक rsyncd (सर्वर) चला सकते हैं।

यह वह दृष्टिकोण है जो मैं ले रहा हूं, क्योंकि मैं बिना पासवर्ड के रूट के रूप में 'गंतव्य' (rsync शब्दों में) की अनुमति देने के लिए ssh का उपयोग नहीं करना चाहता हूं (जैसा कि SSH के साथ rsync में एसएसएल टनलिंग का उपयोग करने के लिए आवश्यक है) पटकथा)

मेरे मामले में, मैं केवल गंतव्य कंप्यूटर पर स्रोत पीसी से अनुमत एकल उपयोगकर्ता के साथ rsyncd सर्वर सेट करता हूं और स्रोत की ओर से rsync का उपयोग करता हूं।

बहुत अच्छा काम करता है।


0

यह प्रयोग करके देखें। इससे मेरा काम बनता है।

ssh src_user@src_host 'rsync -av /src/dir/location/ dest_user@dest_host:/dest/dir/loc/'

0

स्क्रिप्ट का उपयोग करना आसान है

वर्षों से मैंने कई बार कमोबेश एक ही चाल के साथ ऐसा किया है जैसा कि यहाँ हर दूसरे उत्तर में है। हालाँकि, क्योंकि कुछ विवरणों को गलत करना बहुत आसान है और उस मुद्दे को समझने में बहुत समय व्यतीत कर रहा हूँ जो मैं नीचे लिपि के साथ आया हूँ:

  1. सभी विवरणों को निर्दिष्ट करना आसान बनाता है (स्रोत, गंतव्य, विकल्प)
  2. आकस्मिक रूप से हर एक कदम का परीक्षण करता है और कुछ भी गलत होने पर प्रतिक्रिया देता है, ताकि आप जान सकें कि क्या ठीक करना है।
  3. उन मामलों के आसपास काम करता है जहां ssh -Aप्रमाणीकरण डेटा का प्रसार करने में विफल रहता है (पता नहीं क्यों ऐसा कभी-कभी होता है क्योंकि मूल कारण खोजने की तुलना में वर्कअराउंड आसान था)
  4. अंत में नौकरी करता है।

स्क्रिप्ट का उपयोग कैसे करें

  1. सुनिश्चित करें कि आप पासवर्ड टाइप किए बिना लोकलहोस्ट से दोनों होस्ट को ssh कर सकते हैं।
  2. स्क्रिप्ट की पहली कुछ पंक्तियों में चर सेट करें
  3. इसे निष्पादित करो।

यह काम किस प्रकार करता है

जैसा कि मैंने कहा कि यह यहाँ हर दूसरे उत्तर के समान चाल का उपयोग करता है:

  • ssh का -Rविकल्प लोकलहोस्ट से होस्ट 1 तक ssh का विकल्प है जबकि उसी समय एक पोर्ट फॉरवर्डिंग सेट करता है जो तब host1 को localhost के माध्यम से host2 से कनेक्ट करने की अनुमति देता है ( -R localhost:$FREE_PORT:$TARGET_ADDR_PORT)
  • ssh का -Aविकल्प दूसरे ssh चैनल के आसान प्रमाणीकरण की अनुमति देता है

मेरा यह जटिल है! क्या कोई आसान तरीका है?

जब स्रोत से गंतव्य के लिए सभी या अधिकांश बाइट्स को कॉपी यह है एफएआर का उपयोग करना आसान tar:

ssh $SOURCE_HOST "tar czf - $SOURCE_PATH" \
    | ssh $TARGET_HOST "tar xzf - -C $TARGET_PATH/"

लिपी

#!/bin/bash
#-------------------SET EVERYTHING BELOW-------------------
# whatever you type after ssh to connect to SOURCE/TARGE host 
# (e.g. 1.2.3.4:22, user@host:22000, ssh_config_alias, etc)
# So if you use "ssh foo" to connect to SOURCE then 
# you must set SOURCE_HOST=foo
SOURCE_HOST=host1 
TARGET_HOST=host2 
# The IP address or hostname and ssh port of TARGET AS SEEN FROM LOCALHOST
# So if ssh -p 5678 someuser@1.2.3.4 will connect you to TARGET then
# you must set TARGET_ADDR_PORT=1.2.3.4:5678 and
# you must set TARGET_USER=someuser
TARGET_ADDR_PORT=1.2.3.4:5678
TARGET_USER=someuser

SOURCE_PATH=/mnt/foo  # Path to rsync FROM
TARGET_PATH=/mnt/bar  # Path to rsync TO

RSYNC_OPTS="-av --bwlimit=14M --progress" # rsync options
FREE_PORT=54321 # just a free TCP port on localhost
#---------------------------------------------------------

echo -n "Test: ssh to $TARGET_HOST: "
ssh $TARGET_HOST echo PASSED| grep PASSED || exit 2

echo -n "Test: ssh to $SOURCE_HOST: "
ssh $SOURCE_HOST echo PASSED| grep PASSED || exit 3

echo -n "Verifying path in $SOURCE_HOST "
ssh $SOURCE_HOST stat $SOURCE_PATH | grep "File:" || exit 5

echo -n "Verifying path in $TARGET_HOST "
ssh $TARGET_HOST stat $TARGET_PATH | grep "File:" || exit 5

echo "configuring ssh from $SOURCE_HOST to $TARGET_HOST via locahost"
ssh $SOURCE_HOST "echo \"Host tmpsshrs; ControlMaster auto; ControlPath /tmp/%u_%r@%h:%p; hostname localhost; port $FREE_PORT; user $TARGET_USER\" | tr ';' '\n'  > /tmp/tmpsshrs"

# The ssh options that will setup the tunnel
TUNNEL="-R localhost:$FREE_PORT:$TARGET_ADDR_PORT"

echo 
echo -n "Test: ssh to $SOURCE_HOST then to $TARGET_HOST: "
if ! ssh -A $TUNNEL $SOURCE_HOST "ssh -A -F /tmp/tmpsshrs tmpsshrs echo PASSED" | grep PASSED ; then
        echo
        echo "Direct authentication failed, will use plan #B:"
        echo "Please open another terminal, execute the following command"
        echo "and leave the session running until rsync finishes"
        echo "(if you're asked for password use the one for $TARGET_USER@$TARGET_HOST)"
        echo "   ssh -t -A $TUNNEL $SOURCE_HOST ssh -F /tmp/tmpsshrs tmpsshrs"
        read -p "Press [Enter] when done..."
fi

echo "Starting rsync"
ssh -A $TUNNEL $SOURCE_HOST "rsync -e 'ssh -F /tmp/tmpsshrs' $RSYNC_OPTS $SOURCE_PATH tmpsshrs:$TARGET_PATH"

echo
echo "Cleaning up"
ssh $SOURCE_HOST "rm /tmp/tmpsshrs"

tarजब आप एकल (गैर-वृद्धिशील) हस्तांतरण प्राप्त कर लेते हैं तो महान होता है और आपका स्थानांतरण एकल पास में पूरा होता है। दूसरी ओर, rsyncअग्रेषण हैंडल के साथ पुनरारंभ और वृद्धिशील स्थानान्तरण होते हैं।
रोज़ा

1
बेशक @roaima - मैं टार के समकक्ष नहीं मानता। मैंने उस दिन के लिए इस संदर्भ को छोड़ दिया जब मैं एक समस्या को हल करने के लिए इसे पढ़ूंगा जहां rsync 100% आवश्यक नहीं होगा।
ndemou

-1

यह उपयोग करने के लिए संभव है tarके माध्यम से sshफ़ाइलों को हस्तांतरण करने के लिए:

ssh -n user1@host1 'tar jcf - -C /var/www .' | ssh user2@host2 'tar jxvf - -C /var/www'

यदि आप इसके साथ संग्रह को संक्षिप्त करना चाहते हैं, तो jपैरामीटर (के लिए tar) को zदो स्थानों पर बदलें । आमतौर पर इसकी तुलना में उच्च संपीड़न होता है , लेकिन यह धीमा है, इसलिए इसे अपनी आवश्यकताओं के आधार पर बदल दें (देखें: bzip2 बनाम gzip )।gzipbzip2bzip2gzip

संबंधित: कैसे फ़ायरवॉल के पीछे दूरस्थ सर्वर से SSH में टार पाइप का उपयोग करते हुए दो दूरस्थ होस्ट्स के बीच कॉपी करें?


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

$ sshfs user1@host1:/var/www /mnt
$ rsync -vuar /mnt user2@host2:/var/www

1
फाइलसिस्टम को स्थानीय रूप से माउंट करने से स्रोत और स्थानीय मशीन के बीच कोई बैंडविड्थ नहीं बचती है। यह होगा लेकिन स्थानीय और गंतव्य के बीच बैंडविड्थ को बचा (के रूप में यह स्थानीय स्तर पर घुड़सवार नहीं है)। यदि आप गंतव्य पर बैंडविड्थ को बचाने का प्रयास कर रहे हैं तो इस तरह से rsync का उपयोग करना केवल तभी समझ में आता है।
केविन कॉक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.