রিমোট এসএসএইচ সংযোগের মাধ্যমে আরএসসিএন ব্যবহার করার সময় কোনও দূরবর্তী পথে ফাঁকা স্থানগুলি ত্যাগ করা


10

যখন এসএসএইচকে কোনও রিমোট সার্ভারের সাথে আরএসআইএনসি সংযোগ করতে ব্যবহার করেন, তখন আপনি কীভাবে ফাঁকা স্থান এবং এ জাতীয় দূরবর্তী পথে পালাতে পারেন? একটি সাধারণ ব্যাকস্ল্যাশ লোকাল ব্যাশ প্রম্পটের জন্য স্থানটি থেকে পালিয়ে যায়, তবে রিমোট মেশিনে স্থানটি তখন পথের বিরতি হিসাবে পড়তে হবে, এইভাবে সেই পথটির শেষটি চিহ্নিত করে।

সুতরাং যখন আমি যা করি rsync -avz /path/to/source/some\ dir/ user@host.tld:/path/to/dest/some\ dir/তা হ'ল রিমোট সার্ভারটি সেভাবে পড়ছে /path/to/dest/some/এবং যেহেতু এটি দূরবর্তী স্থানটি খুঁজে পায় না কারণ আসল গন্তব্যটি "" কিছু "পরিবর্তে" কিছু দির "।

যদি আমি একই কমান্ডটি চেষ্টা করি এবং স্থানীয় ব্যাশ প্রম্পটটি পাস করতে এবং দূরবর্তী সার্ভারের জন্য ব্যাকস্ল্যাশ বজায় রাখার জন্য ব্যাকস্ল্যাশ এবং স্থানটি ছেড়ে যায় (মোট তিনটি ব্যাকস্ল্যাশ /path/to/dest/some\\\ dir/:) তবে এটি অবশ্যই রিমোট সার্ভারে ব্যাকস্ল্যাশ প্রেরণ করে তবে দূরবর্তী সার্ভারটি তারপরে স্থানটি এবং এরপরে অক্ষরগুলি ছড়িয়ে দেওয়ার /path/to/dest/some\/পরিবর্তে পথটিকে ব্যাখ্যা করে /path/to/dest/some\ dir/

যদি আমি উদ্ধৃতি দিয়ে পথটি মোড়ানোর চেষ্টা করি তবে এটি কার্যকরভাবে একই জায়গায় আচরণ করে, কার্যকরভাবে স্থানটিতে পথটি কেটে ফেলে। সুতরাং এটি কেবলমাত্র স্থানীয় বাশ প্রম্পটটি পেরিয়ে যাওয়ার জন্য কাজ করে।

প্রথমদিকে আমি এমন একটি পাথ ব্যবহার করছিলাম যার মধ্যে "-" (স্পেস-হাইফেন-স্পেস) বিভাগ ছিল এবং রিমোট সার্ভারটি একটি ত্রুটি ফিরিয়ে দিচ্ছিল rsync: on remote machine: -: unknown optionযা এই স্থানটি প্রথম স্থানটিতে পালানোর প্রচেষ্টা শুরু করেছিল।

তাহলে দূরবর্তী পাথর থেকে হাইফেনের মতো ফাঁকা স্থান বা অন্যান্য ভ্রান্ত অক্ষরগুলি সরিয়ে না নিয়ে দূরবর্তী সার্ভারের সাথে এটি সঠিকভাবে কাজ করার জন্য আমার কী করা উচিত?


1
একক এবং ডাবল উভয় উক্তি ব্যবহার করে দেখুন।
jftuga

জ্যাভিয়ার এটিরও উল্লেখ করেছিলেন এবং এটির কাজ শেষ হয়েছিল, তাই আমি তার উত্তরের উত্তরে আমার ওয়ার্কিং কোড বিভাগটি পেস্ট করেছি।
11:30

@ শুদ্ধফিউশন গ্রাগরির উত্তরটিকে সঠিক হিসাবে চিহ্নিত করার বিষয়টি বিবেচনা করুন। -sঠিকানাগুলি প্রয়োজন ছাড়াই ইস্যু ম্যানুয়ালি ডাবল পলায়নের প্রযোজ্য হবে।
এম 1000

উত্তর:


9

ইনিশিয়েটার মেশিনে, rsyncএকটি কমান্ড লাইন তৈরি করে যা রিমোট মেশিনে আরএসসিএন টার্গেটকে ডাকে, তারপরে সেই কমান্ড লাইনটি ssh .... ব্যবহার করে একটি একক স্ট্রিং হিসাবে প্রেরণ করে । সেই একক স্ট্রিংটি শেলকে পার্স করতে, আর্গুমেন্টে বিভক্ত হয়ে সম্পাদন করার জন্য দেওয়া হয় rsync। দূরবর্তী আরএসএনসি-তে কিছু বাইনারি-নিরাপদ ধারকটিতে (ইতিমধ্যে বিভক্ত, প্রসারিত এবং উদ্ধৃত) যুক্তিগুলি প্যাক করার পরিবর্তে কেন এমনটি করা হয়েছে তা আমার কোনও ধারণা নেই।

এর অর্থ হল যে আপনার যুক্তি দুটি পৃথক শেল দ্বারা বিশ্লেষণ করা হবে , সেই অনুসারে উদ্ধৃতি এবং পুনরুদ্ধার করুন । সাধারণত, আমি প্রতিটি যুক্তিকে ডাবল-কোট দিয়ে মুড়ে রাখি এবং তারপরে একক উদ্ধৃতিতে সম্পূর্ণ এক্সপ্রেশন। কখনও কখনও এটি পর্যাপ্ত হয় না, বা আপনি যদি একইরূপে স্থানীয় এবং দূরবর্তীভাবে ব্যবহার করতে চান তবে এটি জটিল হতে পারে।

সেই ক্ষেত্রে, আমি সাধারণত সহজ, নো-স্পেস, সমস্ত-এএসসিআইআই নামগুলির সাথে কয়েকটি সফট লিঙ্ক সেট করি এবং এটি ব্যবহার করি।


8
এবং বিজয়ী ... একক + ডাবল উদ্ধৃতি! হতে পারে এটি প্রতিটি সার্ভারে পৃথক, সুতরাং অন্য উত্তরগুলি যদি কিছু লোকের পক্ষে কাজ না করে তবে সম্ভবত এটি এক করবে। আমি rsync কমান্ডের রিমোট সাইডে ব্যবহার করা সফল কোডটি এখানে রয়েছে:'user@host.tld:"/path/to/dest/some\ dir/"'
59

এখন প্রশ্নটি রয়েছে, কেন এটি (আমার সার্ভারে) কাজ করে তবে অন্যান্য বিকল্পগুলির মধ্যে একটিও নয় (কেবলমাত্র ডাবল উদ্ধৃতিতে পথটি মোড়ানো, বা ট্রিপল-ব্যাকস্ল্যাশ ব্যবহার করে)? আমি 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

তারপরে আপনার আরএসসিএনটি আবার চালান, এবং এটি প্রমাণ করা উচিত যে পালানোর এই পদ্ধতিটি কাজ করে, যেমন

মক্কেলের পক্ষে:

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

উপরের উদাহরণে, সার্ভারে চতুর্থ তর্কটি ( dir with spaces) সমস্ত এক লাইনে রয়েছে বলে যে উদ্ধৃতিটি সঠিকভাবে কাজ করছে।

এটি যদি সহায়তা না করে তবে পুনরায় চালানোর চেষ্টা করুন rsync -v, বা rsync -vv, বা rsync -vvv। এটি আপনাকে অতিরিক্ত ডিবাগিংয়ের তথ্য দেবে।

অন্য দুটি নির্বোধ পরামর্শ:

  • অন্য সার্ভারটি লিনাক্স সার্ভার এবং সেখানে আপনার ডিফল্ট শেলটি কী?
    • হতে পারে এটি ফাইলের নামগুলি আপনার প্রত্যাশার চেয়ে আলাদাভাবে প্রসারিত করছে
  • আপনি যোগ করতে ভুলে গেছ -aবা -rবিকল্প?
    • আমি আপনার আউটপুট না দেখে বলতে পারি না

প্রশ্নের বিবরণে উল্লিখিত হিসাবে, আমি আপনার প্রথম দুটি পদ্ধতি দুটিই চেষ্টা করেছিলাম। সম্ভবত তারা আমার সার্ভারে কাজ করে না। মোড়ক স্ক্রিপ্টগুলি নিয়ে ঘোরাঘুরির মতোও আমার মনে হয়নি। আমি / ইউএসআর / বিন / হ্যাকিং থেকে দূরে থাকার চেষ্টা করি ... যে কোনও ক্ষেত্রেই, উদ্ধৃত করার আরও একটি নির্দিষ্ট উপায় সত্যই আমার পক্ষে কাজ করেছে, তাই সম্ভবত এটি আমার সার্ভারই ​​এইভাবে অভিনয় করছে। আপনার পরামর্শগুলি অন্য সার্ভারের লোকেরা বা সেন্টোস চালাচ্ছেন না তাদের পক্ষে অবশ্যই কার্যকর হতে পারে, যদি ওএস সর্বোপরি সমস্যার অংশ হয় of
শুক্রফিউশন

সুতরাং আপনি এটির কাজটি করার জন্য এটি কীভাবে উদ্ধৃতি দিয়েছিলেন?
মাইকেল

আপনি কিছু গুরুত্বপূর্ণ তথ্য রেখে চলেছেন। আপনি যে আসল কমান্ডটি চালাচ্ছেন তা সম্পূর্ণ পোস্ট করুন।
মাইকেল

2

মূল উত্তর:

-S (আরগগুলি রক্ষা করুন) ব্যবহার করুন এবং আপনার পথটি উদ্ধৃতিতে আবদ্ধ করুন:

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

উভয় স্পেস বা ড্যাশ দিয়ে কাজ করে।


ধন্যবাদ! এটি একটি যথাযথ সমাধান নয়, বরং কর্মক্ষেত্রে।
এম 2000

-2

আপনি কেবল উদ্ধৃতিতে আপনার পথটি বন্ধ করতে পারেন।


1
আপনি যেমন প্রশ্নের বিশদটি দেখে থাকতে পারেন, আমি ইতিমধ্যে এটি চেষ্টা করেছি। তবে, অন্য একটি উত্তর নির্দিষ্ট উদ্ধৃতি ব্যবহারের পরামর্শ দিয়েছিল এবং এটি আসলে কাজ শেষ করে নি। :)
খাঁটিফিউশন

আপনার দুটি উদ্ধৃতি এবং ব্যাকস্ল্যাশ দরকার।
শ্রীধর সারনোবাত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.