আমি scp
ফাইলগুলি আপলোড করতে ব্যবহার করতে চাই তবে মাঝে মাঝে লক্ষ্য ডিরেক্টরি উপস্থিত নাও হতে পারে।
ফোল্ডারটি স্বয়ংক্রিয়ভাবে তৈরি করা সম্ভব? যদি তাই হয়, কিভাবে? যদি তা না হয় তবে আমি কোন বিকল্প উপায়ে চেষ্টা করতে পারি?
আমি scp
ফাইলগুলি আপলোড করতে ব্যবহার করতে চাই তবে মাঝে মাঝে লক্ষ্য ডিরেক্টরি উপস্থিত নাও হতে পারে।
ফোল্ডারটি স্বয়ংক্রিয়ভাবে তৈরি করা সম্ভব? যদি তাই হয়, কিভাবে? যদি তা না হয় তবে আমি কোন বিকল্প উপায়ে চেষ্টা করতে পারি?
উত্তর:
এটি rsync
করতে পারে এমন অনেকগুলি কাজগুলির মধ্যে একটি।
আপনি যদি rsync
বিগত বেশ কয়েক বছর ধরে প্রকাশিত সংস্করণ ব্যবহার করে থাকেন তবে ¹ এর বেসিক কমান্ড সিনট্যাক্সের অনুরূপ scp
: ² ²
$ rsync -r local-dir remote-machine:path
এটি অনুলিপি মেশিনে অনুলিপি local-source
এবং এর বিষয়বস্তুগুলিতে অনুলিপি করবে এবং যে $HOME/path/local-dir
কোনও ডিরেক্টরি যা প্রয়োজন তা তৈরি করে ³
rsync
এখানে কিছু বিধিনিষেধ রয়েছে যা এটি আপনার বিশেষ পরিস্থিতিতে কাজ করবে কিনা তা প্রভাবিত করতে পারে। এটি অনুপস্থিত দূরবর্তী ডিরেক্টরিগুলির একাধিক স্তর তৈরি করবে না; এটি কেবল রিমোটে এক অনুপস্থিত স্তর তৈরি করবে। rsync
কমান্ডের আগে কিছু দিয়ে এর আগে আপনি সহজেই এটি পেতে পারেন :
$ ssh remote-host 'mkdir -p foo/bar/qux'
এটি $HOME/foo/bar/qux
গাছ না থাকলে এটি তৈরি করবে create এটা তোলে অভিযোগ বা অন্য খারাপ কিছু করতে যদি না হবে না ইতিমধ্যেই বিদ্যমান।
rsync
কখনও কখনও অন্যান্য আশ্চর্যজনক আচরণ রয়েছে। মূলত, আপনি এটি অনুলিপি করার জন্য কী বোঝাতে চেয়েছিলেন তা নির্ধারণ করতে বলছেন এবং এর অনুমানগুলি আপনার অনুমানগুলির সাথে মেলে না। চেষ্টা করে দেখুন। যদি এটি আপনার প্রত্যাশা মতো আচরণ না করে এবং আপনি কেন দেখতে না পান তবে আপনার স্থানীয় এবং দূরবর্তী ডিরেক্টরি সেটআপগুলি সম্পর্কে আরও বিশদ পোস্ট করুন এবং আপনি যে আদেশটি চেষ্টা করেছিলেন তা দিয়ে দিন।
পাদটীকা :
rsync
২.6.০ (১ জানুয়ারী ২০০ 2004) এর আগে -e ssh
পতাকাটির এটির মতো আচরণ করা দরকার scp
কারণ এটি অপ্রচলিত আরএসএইচ প্রোটোকলের কাছে ডিফল্ট হয়েছিল ।
scp
এবং rsync
কিছু পতাকা ভাগ করে নিন, তবে ওভারল্যাপের কেবল কিছুটা আছে।
যখন ব্যবহার SSH
ট্রান্সফার প্রোটোকল হিসাবে, rsync
একই অক্ষমতা ব্যবহার করে। সুতরাং, ঠিক যেমন scp
, এটি ধরে নেবে ডিফল্টরূপে দূরবর্তী মেশিনে আপনার স্থানীয় ব্যবহারকারীর মতো একই নামের একজন ব্যবহারকারী আছে।
rsync
ডকুমেন্টেশন পৃষ্ঠা, লগইন করতে কীভাবে ssh-key ব্যবহার করবেন তা খুঁজে পেল না। আমি লগইন করতে ব্যবহারকারীর নাম / পাসওয়ার্ড ব্যবহার করতে চাই না
rsync
। এবং হ্যাঁ, rsync
আপনারও যেমন দূরবর্তী দিকের দরকার ঠিক তেমন scp
। এসএসএইচ কী হিসাবে, rsync
আসলে ডিফল্টের সাথে নীচে এসএসএইচ ব্যবহার করা হয় -e ssh
, সুতরাং আপনার যদি কীগুলির সাথে ব্যবহারের জন্য সেট আপ করা থাকে তবে সেগুলিও scp
সেগুলির জন্য কাজ করবে rsync
।
-r
কোনো পার্থক্য করে তোলে। আপনি যে দৃশ্যের বর্ণনা দিয়েছেন তা কেবল তখনই কাজ করে যদি আপনি কোনও ডিরেক্টরি অনুলিপি করছেন এবং যদি লক্ষ্য প্যারেন্ট ডিরেক্টরি উপস্থিত থাকে। সুতরাং, rsync foo/ u@h:~/
গন্তব্যের ডিরেক্টরি তৈরি করবে foo
কিন্তু rsync foo/ u@h:~/bar/
গন্তব্যের ডিরেক্টরি নির্মাণ করা হবে না bar
। এটি উপস্থিত bar/foo
থাকলেই তৈরি হবে bar/
। যে কোনও ক্ষেত্রে, ওপি ফাইলগুলি আপলোড করছে এবং এমন ক্ষেত্রেও যেখানে এটি কাজ করে, এটি কেবল সম্পূর্ণ ডিরেক্টরিতে কাজ করে।
rsync file host:/foo/file
ব্যর্থ হয় তবে ডিরেক্টরি এবং এটিতে স্থান তৈরি করে । স্ট্রেঞ্জ। যাইহোক, আপনি একদম ঠিক আছেন এবং মূল দৃশ্য কাজ করে, আমি আমার ডাউনটাতে প্রত্যাহার করব। foo/
rsync file host:/foo/
file
আপনি যদি কোনও গ্রুপের ফাইল অনুলিপি করেন তবে সত্যই নয়। আপনি যদি কোনও ডিরেক্টরি এবং এর নীচে সমস্ত সামগ্রী অনুলিপি করছেন তবে হ্যাঁ। এই আদেশ দেওয়া:
$ scp -pr /source/directory user@host:the/target/directory
যদি directory
বিদ্যমান নেই ~/the/target
উপর host
, এটা তৈরি করা হবে। তবে, ~the/target
যদি এটি বিদ্যমান না থাকে, আপনার সম্ভবত সমস্যা থাকতে পারে - আমি এই মামলার সঠিক ফলাফলটি মনে করি না, তবে scp
ব্যর্থ হওয়ার উদ্দেশ্যে প্রস্তুত থাকতে পারি ।
scp: /home/madmike/test_bin: No such file or directory
যত তাড়াতাড়ি লক্ষ্য ডিরেক্টরিটি আমার সেটআপটিতে এই ব্রেকগুলি মিস করছে। ক্লায়েন্টে সাইগউইন এবং সার্ভারে RHEL 6.9 ব্যবহার করছে। আপনার সেটআপ কি?
আমি যতদূর জানি, scp
নিজেই এটি করতে পারে না, না। তবে, আপনি কেবল ssh
লক্ষ্য মেশিনে গিয়ে ডিরেক্টরিটি তৈরি করতে পারেন এবং তারপরে অনুলিপি করতে পারেন। কিছুটা এইরকম:
ssh user@host "mkdir -p /target/path/" &&
scp /path/to/source user@host:/target/path/
মনে রাখবেন যে আপনি যদি পুরো ডিরেক্টরিগুলি অনুলিপি করেন তবে উপরেরটি প্রয়োজন হয় না। উদাহরণস্বরূপ, ~/foo
দূরবর্তী হোস্টে ডিরেক্টরিটি অনুলিপি করতে আপনি -r
(পুনরাবৃত্ত) পতাকাটি ব্যবহার করতে পারেন :
scp ~/foo/ user@host:~/
~/foo
এটি দূরবর্তী হোস্টে লক্ষ্য ডিরেক্টরি তৈরি করবে । তবে এটি প্যারেন্ট ডিরেক্টরি তৈরি করতে পারে না। scp ~/foo user@host:~/bar/foo
লক্ষ্য ডিরেক্টরি bar
উপস্থিত না হলে ব্যর্থ হবে । যে কোনও ক্ষেত্রে, -r
পতাকাটি যদি কোনও পৃথক ফাইল অনুলিপি করে থাকে তবে লক্ষ্য নির্দেশিকা তৈরি করতে সহায়তা করবে না।
হ্যা, তুমি পারো. Scp এর ম্যান পেজ অনুসারে:
মানুষ scp
.....
-r পুনরুক্তি করে সম্পূর্ণ ডিরেক্টরি কপি করুন। নোট করুন যে স্ক্যাপটি গাছের আক্রমণের সময় সিমো বলিক লিঙ্কগুলি অনুসরণ করে।
....
scp -r foo/ u@h:~/bar
তা তৈরি করবে তবে তা না থাকলে ব্যর্থ হবে। bar/foo
bar/
foo
নতুন ডিরেক্টরিতে বিষয়বস্তু অনুলিপি করবে /bar
। অবশ্যই নামটি পরিবর্তন করা হয়েছে যা ওপি যা চায় তা নাও হতে পারে। আপনি যা চান সেটি যদি গন্তব্য মেশিনে তৈরি একটি নতুন গাছের কাঠামো হয় তবে scp
কাজটি করা হবে না, আপনি যা চান তা গাছের একটি নির্দিষ্ট শাখা থেকে গাছের কাঠামোর প্রতিলিপি করা হয় তবে সেই কাঠামোটি তৈরি হয়।
scp -r file host:~/bar/
তৈরি করা হবে bar/
।
btrfs
স্ন্যাপশটগুলি স্থানান্তর করার আগে আমি নিম্নলিখিত ফাংশনটি ব্যবহার করি ssh
:
check_remote_dir() {
printf "\ntesting remote directory: '$1' "
if ssh -p $PORT $ROOT@$REMOTE "[ ! -d $1 ]"; then
printf "\nCreating: $1 on $ROOT@$REMOTE\n"
ssh -p $PORT $ROOT@$REMOTE "mkdir -p $1"
else
printf "[OK]\n"
fi
}
আপনার স্ক্রিপ্টে কেবলমাত্র এর সাথে ফাংশনটি কল করুন:
check_remote_dir /my/remote/path
আপনি mkdir কমান্ডের সাহায্যে কমান্ডটি শৃঙ্খলাবদ্ধ করতে এবং তারপরে আপনার তৈরি ফোল্ডারের রেফারেন্স করতে পারেন:
mkdir ~/new-folder/ && scp -P 22 <remote/url>:~/new-folder/
যখন কোনও এসএসএস উপলব্ধ না হয়ে কেবল স্ক্রিপ বা এসএফটিপিতে সীমাবদ্ধ থাকে (আরএসএস দ্বারা), আরএসসিএন দিয়ে ফাঁকা ডিরেক্টরি ট্রিটি অনুলিপি করে ফাইলগুলি অনুলিপি করে ডিরেক্টরি তৈরি করা সম্ভব।
Ssh-copy-id কাজ না করে এবং .ssh ডিরেক্টরি উপস্থিত না থাকায় আমি দূরবর্তী হোস্টে পাবলিক ssh কীটি এভাবে রাখি:
rsync -e 'ssh -p22' -av -f"+ */" -f"- *" ~/.ssh backup@1.2.3.4:~/
scp -P22 ~/.ssh/id_rsa.pub backup@1.2.3.4:~/.ssh/authorized_keys
যদি লক্ষ্য ফাইলের নাম একই থাকে তবে এই কমান্ডগুলি একটি আরএসসিএনকে একত্রিত করে মাঝখানে আরও একটি ফিল্টার অন্তর্ভুক্ত করা সম্ভব।