BSync একটি বাশ স্ক্রিপ্টে "অনুপস্থিত ট্রেলিং-" about সম্পর্কে অভিযোগ করছে ining


13

স্ক্রিন সেশনে একটি সার্ভার থেকে অন্য সার্ভারে ফাইলগুলি আরএসআইএনসি করার চেষ্টা করছে। লং কমান্ড প্রতিবার একবার লেখার পরিবর্তে, আমি বাশ স্ক্রিপ্টে রাখার সিদ্ধান্ত নিয়েছি। যাইহোক, আমি এটি চালানোর সময়, আমি একটি Missing trailing-" in remote-shell command.ত্রুটি পাই ।

স্ক্রিপ্টে কী ভুল হচ্ছে ভাবছেন।

root@127.0.0.1:~# /raid/data/module/bin/rbk.sh Movies /raid/data/Movies rsync_target/

/raid/data/module/bin/screen -S Movies 

/opt/bin/rsync --rsh="ssh -p 10022 -c des"\
--rsync-path="/opt/bin/rsync" --inplace --progress -a -vv \
/raid/data/Movies sys@192.168.1.15:/raid/data/rsync_target/

Missing trailing-" in remote-shell command.
rsync error: syntax or usage error (code 1) at main.c(361) [sender=3.0.5]

স্ক্রিপ্টটি প্রতিধ্বনিত করে এটি প্রথমে কী করবে এবং তারপরে কমান্ডটি কার্যকর করে। নীচে আমার স্ক্রিপ্টের ডাম্প রয়েছে:

#!/bin/bash
SCREEN="/raid/data/module/bin/screen"
SCREENOPT="-S"
SCREEN_TITLE=$1

RSYNC="/opt/bin/rsync"
RSYNCOPT="--rsh=\"ssh -p 10022 -c des\" --rsync-path=\"/opt/bin/rsync\" --inplace --progress -a -vv"

SOURCE=$2

REMOTE_USER="sys@"
REMOTE_HOST="192.168.1.15"
REMOTE_BASE=":/raid/data/"
REMOTE_TARGET=$3

echo ${SCREEN} ${SCREENOPT} ${SCREEN_TITLE}

echo ${RSYNC} ${RSYNCOPT} ${SOURCE} ${REMOTE_USER}${REMOTE_HOST}${REMOTE_BASE}${REMOTE_TARGET}
${RSYNC} ${RSYNCOPT} ${SOURCE} ${REMOTE_USER}${REMOTE_HOST}${REMOTE_BASE}${REMOTE_TARGET}

উত্তর:


23

সংক্ষিপ্ত উত্তর: বাশফ্যাঙ্কা # 050 দেখুন

দীর্ঘ উত্তর: আপনার যে সমস্যাটি হচ্ছে তা হ'ল ভেরিয়েবলগুলিতে উদ্ধৃতি এম্বেড করা আপনার ভাবনার মতো কাজ করে না। বিশেষত, ভেরিয়েবলগুলি প্রতিস্থাপনের আগে উদ্ধৃতিগুলি পার্স করা হয়, সুতরাং যদি কোনও ভেরিয়েবলের মানতে কোট অন্তর্ভুক্ত থাকে তবে তাদের সঠিক কাজ করতে খুব দেরী হবে। আপনি যখন কমান্ড লাইনে সেট করেন RSYNCOPT="--rsh=\"ssh -p 10022 -c des\" ..."এবং তারপরে ব্যবহার ${RSYNCOPT}করেন, ভেরিয়েবলের উদ্ধৃতিগুলি পার্স হয় না, সেগুলি কেবল সাধারণ অক্ষর হিসাবে বিবেচিত হয়। সুতরাং, বরং rsync কমান্ড একটি একক পরামিতি গ্রহণ --rsh=ssh -p 10022 -c des, এটা গ্রহণ করে 5: --rsh="ssh, -p, 10022, -c, এবং des"। যেহেতু --rs কমান্ডটিতে একটি একক (তুলনামূলক) উদ্ধৃতি রয়েছে, আপনি একটি ত্রুটি পান।

কী আরও ভাল চলছে তা দেখতে, set -xপ্রতিটি কমান্ড কার্যকর করার আগে শেল প্রিন্ট তৈরি করুন (যাতে আপনি সত্যিই কী ঘটছে তা দেখতে পারেন), বা echo ${whatever}(যা অত্যন্ত বিভ্রান্তিকর) এর সাথে প্রতিস্থাপন করুন printf "%q " ${whatever}; echo

এটি সমাধান করার বিভিন্ন উপায় রয়েছে। একটি হ'ল RSYNCOPTপ্রথম স্থানে চলকগুলিতে (এবং সম্ভবত অন্যান্য জিনিসগুলি) সংরক্ষণ করার চেষ্টা করা এড়ানো avoid আর একটি হ'ল RSYNCOPTসরল স্ট্রিংয়ের পরিবর্তে অ্যারে হিসাবে সংরক্ষণ করা (যা এই বিভ্রান্তির কিছুই ছাড়াই শব্দের সীমানা ট্র্যাক করতে পারে)।

কমান্ডটি কার্যকর করার আগে মুদ্রণের জন্য, হয় set -xrsync কমান্ডের আগে ব্যবহার করুন এবং এটি বন্ধ করার জন্য + x সেট করুন, বা printfআমি উপরে তালিকাভুক্ত কমান্ডের মতো কিছু ব্যবহার করুন (নোট করুন যে এটি কমান্ডের পরে একটি ফাঁকা স্থান প্রিন্ট করে, তবে এটি সাধারণত করে না ' t ব্যাপার)।

এখানে অ্যারে + প্রিন্টফ পদ্ধতিটি রয়েছে:

...
RSYNCOPT=(--rsh="ssh -p 10022 -c des" --rsync-path=\"/opt/bin/rsync\" --inplace --progress -a -vv)
...
printf "%q " ${SCREEN} ${SCREENOPT} ${SCREEN_TITLE}
echo

printf "%q " ${RSYNC} "${RSYNCOPT[@]}" ${SOURCE} ${REMOTE_USER}${REMOTE_HOST}${REMOTE_BASE}${REMOTE_TARGET}
echo
${RSYNC} "${RSYNCOPT[@]}" ${SOURCE} ${REMOTE_USER}${REMOTE_HOST}${REMOTE_BASE}${REMOTE_TARGET}

আমাকে সঠিক দিকে নির্দেশ করার জন্য ধন্যবাদ, যাইহোক আপনি যে লিঙ্কটি দিয়েছেন তার তাত্ক্ষণিকভাবে নজর আমাকে নিশ্চিত করেছে যে কোনও ফাংশন বেশি পঠনযোগ্য (বা কমপক্ষে এটি সঠিকভাবে ফর্ম্যাট করার সময় তাই হয়ে যায়): run_rsync() { /opt/bin/rsync "--rsh=\"ssh -p 10022 -c des\" --rsync-path=\"/opt/bin/rsync\" --inplace --progress -a -vv" $1 $2 } run_rsync ${SOURCE} ${REMOTE_USER}${REMOTE_HOST}${REMOTE_BASE}${REMOTE_TARGET} (আমি জানি, এটি বেশ পুরানো, তবে এখনও একটি রিমোট শেল কমান্ডে "অনুপস্থিত ট্রেলিং-" অনুসন্ধানের সময় প্রথম লিঙ্কগুলির মধ্যে)
ফ্রান্সেস্কো মার্কেটি-স্টাসি

6

পালিয়ে যাওয়া এবং অব্যক্ত উদ্ধৃতি চিহ্নগুলির গোলকধাঁধায় আপনার $RSYNCOPTহ্যাকটি আমার থেকে বিভ্রান্ত করেছে; আমি বিস্মিত হই না যে এটি আরএসসিএন, এবং / অথবা এসএস, এবং / অথবা স্থানীয় বা দূরবর্তী শেলকে বিভ্রান্ত করে।

ব্যাকস্ল্যাশগুলি যোগ করে বা মুছে ফেলে এটির কাজ করার কোনও উপায় থাকতে পারে, তবে আমি পরিবর্তে নিম্নলিখিত কাজটি প্রস্তাব করছি:

প্রতিস্থাপন করুন:

RSYNCOPT="--rsh=\"ssh -p 10022 -c des\" --rsync-path=\"/opt/bin/rsync\" --inplace --progress -a -vv"

দ্বারা:

export RSYNC_RSH="ssh -p 10022 -c des"
RSYNCOPT="--rsync-path=\"/opt/bin/rsync\" --inplace --progress -a -vv"

আমি আমার সিস্টেমে আপনার স্ক্রিপ্টটির কিছুটা সরলিকৃত সংস্করণ চেষ্টা করেছি এবং আপনার মতো একই ত্রুটি বার্তা পেয়েছি; এই workaround এটি সংশোধন।


1

Ssh কনফিগারেশন ফাইল ব্যবহার করাও একটি বৈধ বিকল্প। আপনি নিজের ~/.ssh/configফাইলে যা যুক্ত / যুক্ত করতে পারেন তা এখানে :

Port 10022
Cipher des

আপনি এই প্যারামিটারগুলি দূরবর্তী হোস্টের মাধ্যমে এই লাইনগুলি প্রেরণ করে Host xyz.domain.whateverএবং সেগুলি ইনডেন্ট করে ফিল্টার করতে পারেন :

Host 192.168.1.15
    Port 10022
    Cipher des
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.