दूरस्थ SSH कनेक्शन पर rsync का उपयोग करते समय एक दूरस्थ पथ में रिक्त स्थान


10

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

इसलिए जब मैं करता हूं तो rsync -avz /path/to/source/some\ dir/ user@host.tld:/path/to/dest/some\ dir/यह होता है कि रिमोट सर्वर पढ़ रहा है कि जैसे ही /path/to/dest/some/वह और वह गंतव्य दूर से नहीं पा सकते हैं, क्योंकि वास्तविक गंतव्य "कुछ" के बजाय "कुछ dir" है।

अगर मैं एक ही कमांड का प्रयास करता हूं और स्थानीय बैश प्रॉम्प्ट को प्राप्त करने के लिए बैकस्लैश और स्पेस से बचता हूं और रिमोट सर्वर के लिए बैकलैश को बनाए रखता हूं (तीन बैकस्लैश कुल:) /path/to/dest/some\\\ dir/, यह वास्तव में बैकलैश को रिमोट सर्वर पर भेजता है, लेकिन रिमोट सर्वर इसके बाद अंतरिक्ष और उसके बाद के पात्रों को हटाने के /path/to/dest/some\/बजाय मार्ग की व्याख्या करता /path/to/dest/some\ dir/है।

यदि मैं उद्धरण के साथ पथ को लपेटने की कोशिश करता हूं, तो यह उसी तरह से बहुत व्यवहार करता है, प्रभावी रूप से अंतरिक्ष में रास्ता काट रहा है। इसलिए यह केवल स्थानीय बैश प्रॉम्प्ट को प्राप्त करने के लिए काम करता है।

प्रारंभ में मैं एक पथ का उपयोग कर रहा था जिसमें एक "-" (स्पेस-हाइफ़न-स्पेस) खंड था, और रिमोट सर्वर एक त्रुटि लौटा रहा था rsync: on remote machine: -: unknown optionजो कि इस पूरे अंतरिक्ष-भागने के प्रयास को पहली जगह में शुरू किया था।

तो मुझे दूरस्थ सर्वर के साथ ठीक से काम करने के लिए क्या करना चाहिए, बिना रिक्त स्थान या अन्य गलत वर्णों को हटाने के लिए, जैसे कि दुर्गम रास्ते से हाइफ़न?


1
एकल और दोहरे उद्धरणों का प्रयास करें।
jftuga

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

@purefusion ग्रेजोरी के उत्तर को सही मानने पर विचार करें। -sपतों की आवश्यकता के बिना इस मुद्दे को मैन्युअल रूप से डबल बचने लागू करने के लिए।
m000

जवाबों:


9

सर्जक मशीन पर, rsyncएक कमांड लाइन बनाता है जो रिमोट मशीन पर rsync लक्ष्य को आमंत्रित करता है, फिर ssh का उपयोग करके उस कमांड लाइन को भेजता है .... एक स्ट्रिंग के रूप में । उस एकल तार को शेल को पार्स करने, तर्कों में विभाजित करने और निष्पादित करने के लिए पारित किया जाता है rsync। मुझे नहीं पता कि रिमोट बंसल के लिए कुछ बाइनरी-सुरक्षित कंटेनर में (पहले से ही विभाजित, विस्तारित और अनछुए) तर्कों को पैक करने के बजाय ऐसा क्यों किया गया है।

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

उस स्थिति में, मैं आमतौर पर सरल, नो-स्पेस, सभी-एएससीआईआई नामों के साथ कुछ नरम लिंक सेट करता हूं और इसका उपयोग करता हूं।


8
और विजेता है ... एकल + दोहरे उद्धरण! शायद यह हर सर्वर पर अलग है, इसलिए यदि अन्य उत्तर कुछ लोगों के लिए काम नहीं करते हैं, तो शायद यह होगा। यहाँ मैं rsync कमांड के रिमोट साइड पर उपयोग किया गया सफल कोड है:'user@host.tld:"/path/to/dest/some\ dir/"'
प्योरफ्यूजन

अब सवाल यह है कि, यह (मेरे सर्वर पर) काम क्यों करता है, लेकिन अन्य विकल्पों में से कोई भी नहीं (बस दोहरे उद्धरण चिह्नों में लपेटकर, या ट्रिपल-बैकस्लैश का उपयोग करके)? मैं CentOS 5 चला रहा हूँ अगर वह मायने रखता है।
प्योरफ्यूजन

यह आवश्यक नहीं होना चाहिए। आप इसे कैसे चला रहे हैं? क्या आप इसे evalफंक्शन के माध्यम से या कॉल के माध्यम से चला रहे हैं ?
मिकेल

आप सिंगल प्लस डबल कोट्स का उपयोग नहीं कर रहे हैं। आप सिंगल कोट्स और डबल कोट्स प्लस बैकस्लैश एस्केप का उपयोग कर रहे हैं। उद्धरण के तीन स्तर। यह अनावश्यक होना चाहिए। मैं फिर पूछता हूं: आप इसे कैसे चला रहे हैं ?
मिकेल

@ जेवियर "मुझे नहीं पता कि ऐसा क्यों किया गया है"। संभवतः इसलिए कि टिल्ड विस्तार कार्य करता है।
मिकेल

2

जब आपने कहा तो आप सही रास्ते पर थे:

अगर मैं एक ही कमांड की कोशिश करता हूं और बैकलैश और स्पेस से बचकर स्थानीय बैश प्रॉम्प्ट से बाहर निकलता हूं और रिमोट सर्वर के लिए बैकलैश को बनाए रखता हूं

यहाँ एक तरीका है जो मुझे करना आसान लगता है:

rsync -av dir\ with\ spaces/ server.tld:"dir\ with\ spaces"

और इस तरह से भी काम करता है।

rsync -av dir\ with\ spaces/ server.tld:dir\\\ with\\\ spaces

क्या आप सटीक आउटपुट और आपके द्वारा देखी जा रही किसी भी त्रुटि को पोस्ट कर सकते हैं?

क्या आप rsyncएक रैपर स्क्रिप्ट के साथ दोनों तरफ बदल सकते हैं ?

$ sudo su -
# cd /usr/bin
# mv rsync rsync.real
# cat <<'EOF' >rsync
#!/bin/bash
logfile=/home/yourname/rsync.log
date >> "$logfile"
i=1
for arg in "$@"; do
    echo "arg $i: $arg" >> "$logfile"
    i=$((i+1))
done

rsync.real "$@"
EOF
# chmod +x rsync

फिर अपना rsync फिर से चलाएं, और यह साबित होना चाहिए कि भागने का यह तरीका काम करता है, जैसे

ग्राहक की ओर:

Sun Feb 13 13:48:12 EST 2011
1: -av
2: dir with spaces/
3: server:dir\ with\ spaces

सर्वर साइड:

Sun Feb 13 13:48:13 EST 2011
1: --server
2: -vlogDtpre.iL
3: .
4: dir with spaces

उपरोक्त उदाहरण में, तथ्य यह है कि सर्वर पर 4 वें तर्क ( dir with spaces) सभी एक पंक्ति में कहते हैं कि उद्धरण सही ढंग से काम कर रहा है।

यदि यह मदद नहीं करता है, तो पुनः चलाने की कोशिश करें rsync -v, या rsync -vv, या rsync -vvv। यह आपको अतिरिक्त डिबगिंग जानकारी देगा।

दो अन्य मूर्खतापूर्ण सुझाव:

  • अन्य सर्वर एक लिनक्स सर्वर है, और वहां आपका डिफ़ॉल्ट शेल क्या है?
    • शायद यह आपकी अपेक्षा से भिन्न फ़ाइल नामों का विस्तार कर रहा है
  • क्या आप -aया -rविकल्प जोड़ना भूल गए ?
    • मैं आपका आउटपुट देखे बिना नहीं बता सकता

जैसा कि प्रश्न के विवरण में बताया गया है, मैंने वास्तव में आपके पहले दो तरीकों की कोशिश की थी। शायद वे सिर्फ मेरे सर्वर पर काम नहीं करते। मैं भी आवरण लिपियों के साथ खिलवाड़ की तरह महसूस नहीं किया। मैं / usr / bin / ... को हैक करने से दूर रहने की कोशिश करता हूं। किसी भी स्थिति में, उद्धृत करने का एक और विशिष्ट तरीका वास्तव में मेरे लिए काम करता है, इसलिए शायद यह सिर्फ मेरा सर्वर है जो इस तरह से काम कर रहा है। आपके सुझाव निश्चित रूप से अन्य सर्वर पर लोगों के लिए, या उन लोगों के लिए व्यवहार्य हो सकते हैं, जो CentOS नहीं चला रहे हैं, अगर OS ​​समस्या का हिस्सा है।
प्योरफ्यूजन

तो आपने इसे काम करने के लिए कैसे उद्धृत किया?
मिकेल

आप कुछ महत्वपूर्ण विवरण छोड़ रहे हैं। कृपया आप जो वास्तविक कमांड चला रहे हैं, उसे पूरी तरह से पोस्ट करें।
मिकेल

2

बिंदु उत्तर:

उपयोग -s (आर्ग की रक्षा करें) और उद्धरण में अपना पथ संलग्न करें:

rsync -savz user@server:"/my path with spaces/another dir/" "/my destination/"

रिक्त स्थान या डैश दोनों के साथ काम करता है।


धन्यवाद! यह एक समाधान के बजाय एक उचित समाधान है।
m000

-2

आप बस अपना रास्ता उद्धरणों में संलग्न कर सकते हैं।


1
जैसा कि आपने प्रश्न के विवरण में देखा होगा, मैंने वास्तव में पहले से ही यह कोशिश की है। हालांकि, एक अन्य उत्तर ने विशिष्ट उद्धरण उपयोग का सुझाव दिया, और यह वास्तव में काम करना समाप्त कर दिया। :)
प्योरफ्यूज़न

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