क्या sspp (ssh शेल के बिना) पर rsync का उपयोग करना संभव है?


60

Ssh पर Rsync, हर बार बढ़िया काम करता है।

हालाँकि, एक मेजबान के लिए rsync की कोशिश करना जो केवल sftp लॉगिन की अनुमति देता है, लेकिन ssh लॉगिन नहीं, निम्न त्रुटि प्रदान करता है:

rsync -av / source ssh user @ Remotehost: / target /

प्रोटोकॉल संस्करण बेमेल - क्या आपका शेल साफ है? (rsync मैन पेज को एक स्पष्टीकरण के लिए देखें) rsync त्रुटि: कंपेटिटिव असंगतता (कोड 2) पर कंपोज़िटसी (171) [प्रेषक = 3.0.6]

यहाँ rsync मैन पेज से संबंधित अनुभाग दिया गया है:

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

          ssh remotehost /bin/true > out.dat

फिर out.dat को देखें। यदि सब कुछ सही ढंग से काम कर रहा है तो out.dat एक शून्य लंबाई फ़ाइल होनी चाहिए। यदि आपको rsync से उपरोक्त त्रुटि मिल रही है तो आप संभवतः पाएंगे कि out.dat में कुछ पाठ या डेटा हैं। सामग्री को देखें और यह काम करने की कोशिश करें कि यह क्या उत्पादन कर रहा है। सबसे कॉमन मोन कारण गलत तरीके से शेल स्टार्टअप स्क्रिप्ट कॉन्फ़िगर किया गया है (जैसे .cshrc या .profile) जिसमें गैर-संवादात्मक लॉगिन के लिए आउटपुट स्टेटमेंट होते हैं।

मेरे सिस्टम पर इसे आज़माने से out.dat में निम्न उत्पादन हुआ:

ssh-dummy-shell: कमांड की अनुमति नहीं है।

जैसा कि मैंने सोचा था, मेजबान ssh लॉगिन की अनुमति नहीं दे रहा है।

निम्नलिखित लिंक से पता चलता है कि sshfs के साथ फ्यूज का उपयोग करके इस कार्य को पूरा करना संभव है - हालांकि यह बेहद धीमा है, और उत्पादन के उपयोग के लिए फिट नहीं है।

क्या काम करने के लिए rsync sftp प्राप्त करने का कोई मौका है?


3
lftp टोटका करेगा। मैं स्थानीय स्विच को -R स्विच के साथ सिंक कर

क्या आप जानते हैं कि सर्वर पर कमांड कैसे प्रतिबंधित हैं? यदि यह sshd_config में ForceCommand सेट करके है, तो देखें कि क्या आप उस फ़ाइल को संशोधित कर सकते हैं जो इंगित करता है। या अगर यह अधिकृत_कीप्स में कमांड द्वारा सेट किया गया है, तो हो सकता है कि आप sshfs पर अधिकृत_कीप को एक्सेस कर सकते हैं और इसे बदल सकते हैं?
10

आप csync आज़मा सकते हैं : csync /home/csync sftp://csync@krikkit.galaxy.site:2222/home/csyncयह उत्तर देखें ।
nachtigall

6
आखिरकार, मैंने इसे lftp के साथ किया :lftp -e "mirror -eRv /local/dir/ /remote/dir; quit;" sftp://user@server:port
nachtigall

@nachtigall क्या आप जानते हैं कि एकाधिक इनपुट फ़ाइलों / फ़ाइलों और डायरियों की सूची के साथ lftp का उपयोग कैसे किया जाता है?
बोर्ट्रान

जवाबों:


39

दुर्भाग्य से सीधे तौर पर नहीं। rsyncएक शेल के साथ एक स्वच्छ लिंक की आवश्यकता होती है जो इसे rsyncइस तरह से चलाने पर रिमोट कॉपी शुरू करने की अनुमति देगा ।

यदि आपके पास होस्ट पर लंबे समय तक रहने वाली सुनने की प्रक्रियाओं को चलाने का कोई तरीका है, तो आप गैर-विशेषाधिकार प्राप्त बंदरगाह पर कनेक्शन के लिए मैन्युअल रूप से rsync शुरू करने की कोशिश कर सकते हैं, लेकिन ऐसा करने के लिए अधिकांश तकनीकों को SSH के माध्यम से उचित शेल एक्सेस की आवश्यकता होगी, और यह निर्भर करता है मेजबान फ़ायरवॉल आपके द्वारा चुने गए पोर्ट पर कनेक्शन देने की व्यवस्था करता है (और पहले स्थान पर स्थापित rsync होस्ट)। सार्वजनिक रूप से संबोधित करने योग्य सेवा (SSH या समान के माध्यम से अप्रत्यक्ष रूप से) के रूप में rsync चलाना आम तौर पर गैर-सार्वजनिक डेटा के लिए अनुशंसित नहीं है।

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

ऊपर वर्णित के रूप में संदेश भेजना मेजबान नीतियों के खिलाफ हो सकता है, भले ही यह बिल्कुल भी काम करता हो, और आपको लात मार सकता है। आप यह पूछना बेहतर समझते हैं कि क्या उस खाते के लिए एक पूर्ण शेल सक्षम किया जा सकता है और या तो उस होस्ट के लिए rsync को छोड़ना या उस होस्ट को छोड़ना और कहीं और ले जाना यदि वे ऐसा नहीं करेंगे।


2
ध्यान दें कि इसमें पूर्ण शेल नहीं होना चाहिए; इसे बस rsync को चलाने के लिए उचित तर्कों के साथ आज्ञा देना है। scponly इसके लिए उपयोगी है।
Sciurus

19

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


11
वह काम करना चाहिए जब टाइमस्टैम्प + आकार की तुलना यह तय करने के लिए पर्याप्त हो कि भेजने की आवश्यकता क्या है। जैसे ही एक चेकसम की जरूरत होती है पूरी रिमोट फाइल लाइन पर पढ़ी जाएगी और साथ ही अपडेट भेजे जाएंगे, इसलिए सुनिश्चित करें कि आपके पास rsync के विकल्प सेट हैं जैसे कि यह प्रत्येक फ़ाइल के लिए ऑल-या-कुछ भी करता है (--ignore- का उपयोग करके नहीं) समय या - जांच और सम्‍मिलित - जब फ़ाइल निर्दिष्ट की जाए तो काफी हो सकती है)। कुछ विकल्प जैसे - विलिंक-डेस्ट इस तरह से (या बिल्कुल) ठीक से काम करने की अत्यधिक संभावना नहीं है।
डेविड Spillett

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

यह सीमाओं के साथ एक वर्कअराउंड है, हाँ, लेकिन यह पर्याप्त है अगर "उचित" rsync को लागू करने का कोई तरीका नहीं है
Valery Lourie

10

Rsync का उपयोग करने का एक विकल्प इसके बजाय lftp (जो sftp से कनेक्ट हो सकता है) का उपयोग करना है और दर्पण कमांड का उपयोग करना है। उदाहरण के लिए कोई भी कर सकता है

lftp
~> open -u user,password sftp://host.com
~> mirror remotedir outdir
~> quit

1
हालांकि यह पोस्ट इस सवाल का जवाब नहीं देता है कि यह एक उपयोगी विकल्प प्रदान करता है
दिमित्री चुबरोव

5

थोड़ा देर से, लेकिन यहाँ मैं इसे कैसे करता हूँ, sshfs का उपयोग करते हुए

  source /scratch/slimdata/password.sh
  mkdir tmp_mnt
  echo $PASSWORD | sshfs user@host:dir tmp_mnt -o password_stdin
  rsync -rutL --delete tmp_mnt/ to_sync/
  fusermount -u tmp_mnt
  rmdir tmp_mnt

3
जैसा कि @David Spillett पूर्व उत्तर ( serverfault.com/questions/135618/… ) पर अपनी टिप्पणी में कहता है , यह काम करेगा लेकिन rsync प्रोटोकॉल का एक अक्षम्य सा प्रयोग है।
इवान एंडरसन

2
जोनाथन, मुझे लगता है कि आपका समाधान गलत है। यदि आप एक दूरस्थ ड्राइव को माउंट करते हैं और rsync को निष्पादित करते हैं जैसे आप दो स्थानीय फ़ोल्डरों को सिंक करेंगे, तो हमेशा सिंकिंग पर सब कुछ स्थानांतरित हो जाता है क्योंकि आपके स्थानीय मशीन पर rsync प्रक्रिया की गणना दूरस्थ फ़ाइलों के हैश मानों से होती है। इसका मतलब है कि पूरी फ़ाइल स्थानांतरित हो गई है और rsync के लाभ खो गए हैं। संपादित करें: आह यह उत्तर कई बार दिया गया है ... प्रतिकृति के लिए sry: D
Thekwasti


2

एक विकल्प यह होगा कि rsync को डेमन के रूप में शुरू किया जाए और SSH सुरंग के माध्यम से इसे जोड़ा जाए।


यह उत्तर पूरी तरह से सहायक होने के लिए बहुत छोटा है, लेकिन अगर सर्वर पक्ष शेल एक्सेस की अनुमति नहीं दे सकता है लेकिन (1) एक rsync सर्वर स्थानीय रूप से (सुरक्षा के लिए बाहर से उपलब्ध नहीं), और (2) ssh सुरंग की अनुमति दे सकता है, तो सिद्धांत एक सर्वर में एक नियम के माध्यम से लॉग इन कर सकता authorized_keysहै जो एक विशिष्ट सुरंग की अनुमति देता है और उदा sleep 86400। तब ग्राहक पक्ष तब rsyncसुरंग के माध्यम से जा सकता था ।
स्टीफन गौरिचोन

2

विकल्प सभी का सबसे अच्छा संयोजन

ऐसा प्रतीत होता है कि निम्नलिखित लाभ हैं जिनके अन्य उत्तर यहां नहीं हैं:

  • SSH से पूरी तरह से लाभ (सुरक्षित)
  • rsync (बैंडविड्थ-कुशल प्रोटोकॉल, बैंडविड्थ सीमा जैसे सभी rsync विकल्प) से पूरी तरह से लाभ
  • वास्तव में कुशल (sshfs के विपरीत जो कभी-कभी दिनों को बचाते हैं लेकिन अभ्यास में अभी भी धीमी है)
  • सर्वर-साइड में मनमाने ढंग से शेल कमांड की आवश्यकता नहीं है
  • ssh सुरंगों को अनुमति देने के लिए सर्वर की आवश्यकता नहीं है
  • rsyncडेमॉन चलाने के लिए सर्वर की आवश्यकता नहीं होती है

मैंने अभी तक इसका परीक्षण नहीं किया है, लेकिन मैंने उन सभी विशेषताओं को छोड़कर सफलतापूर्वक उपयोग किया है rrsync

यह कैसे करना है

  • स्थानीय रूप से एक कुंजी बनाएं ssh-keygen(ओपनएसएसएच सुविधा)
  • सर्वर की प्रविष्टि ~/.ssh/authorized_keys(ओपनएसएसएच सुविधा) के साथ केवल उस विशिष्ट कुंजी के साथ लॉगिन की अनुमति दें
  • इस कुंजी को एक विशिष्ट कमांड के साथ जोड़ दें, ~/.ssh/authorized_keys(ओपनएसएसएच फीचर) कमांड के रूप में rrsyncrsync के साथ वितरित स्क्रिप्ट का उपयोग करके , कुछ इस तरहcommand="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-

फिर आप क्लाइंट से सामान्य रूप से rsync कर सकते हैं।

यदि आपको अधिक जानकारी चाहिए

SSH तक पहुँच प्रतिबंधित rsync | गाइ रटनबर्ग

ऊपर दिए गए लिंक से एक कदम आगे

उस पृष्ठ के अंत में कमांड को छोटा किया जा सकता है। में ~/.ssh/configइस तरह की एक छंद बनाने के लिए:

Host remote # can be host or ip or custom-label User user # login on remote host HostName optional-dns-resolvable-host-or-ip # if label used above IdentityFile ~/.ssh/id_remote_backup

फिर क्लाइंट से आपकी rsync कमांड

rsync -e "ssh -i $HOME/.ssh/id_remote_backup" -av user@remote: etc2/

हो जाता है

rsync -av user@remote: etc2/

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

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