আমি কীভাবে বৃহত্তর সংখ্যক ছোট ফাইলকে scp- এর মাধ্যমে অনুলিপি করতে পারি?


59

আমার একটি ডিরেক্টরি রয়েছে যা বেশ কয়েকটি গিগাবাইট এবং কয়েক হাজার ছোট ফাইল পেয়েছে। আমি এটি একাধিকবার স্ক্রিপ দিয়ে নেটওয়ার্কে অনুলিপি করতে চাই। উত্স এবং গন্তব্য মেশিনে সিপিইউ সময় সস্তা, তবে প্রতিটি ফাইল স্বতন্ত্রভাবে অনুলিপি করে সংযুক্ত নেটওয়ার্ক ওভারহেড বিশাল। আমি এটিকে টারে / জিজিপ করে এনে শিপ করব, তবে উত্স মেশিনটি ডিস্কে স্বল্প।

আমার জন্য কি স্কিপ আউটপুটটি পাইপ করার কোনও উপায় আছে tar -czf <output> <directory>? যদি তা না হয়, তবে কি আরও সহজ সমাধান আছে? আমার উত্স মেশিনটি প্রাচীন (সুনোস) তাই আমি এটিতে জিনিসগুলি ইনস্টল করতে যাব না।

উত্তর:


104

আপনি একটি ssh অধিবেশন জুড়ে তারের পাইপ করতে পারেন:

$ tar czf - <files> | ssh user@host "cd /wherever && tar xvzf -"

3
+1 টার-পাইপ সমাধান। আপনার যদি আরও ব্যান্ডউইথ এবং কম সিপিইউ থাকে তবে আপনি সংক্ষেপণ পতাকাটি সরাতে পারবেন (যদিও জিজিপ বেশ হালকা ওজনের)।
ডায়েটবুদ্ধ

2
এবং আপনি সংক্ষেপণ পতাকাটি ফেলে দিতে পারেন এবং পরিবর্তে এটি এসএসএইচে ( ssh -Cবা Compression yesইন ~/.ssh/config) সক্রিয় করতে পারেন ।
সাম হোচেভার

3
এরকম টার ব্যবহার করার কথা কখনও ভাবেননি। আচ্ছা, আমি এখানে কেন আসছি!
মিঃ শিকাড্যান্স

2
এই কমান্ডটি কিছুটা ছোট করা যেতে পারে:$ tar cz <files> | ssh user@host "cd /wherever; tar xvz"
কার্লিটো

2
@ গ্রেগ ড্যাশ প্রসঙ্গের উপর নির্ভর করে STDIN বা STDOUT বোঝার জন্য পসিএক্স সামঞ্জস্যপূর্ণ সফ্টওয়্যার একটি কনভেনশন। প্রথম ড্যাশটির অর্থ হ'ল '/ দেব / স্টিডিন থেকে পঠিত' এবং দ্বিতীয়টি - যা বাস্তবে দূরবর্তী হোস্টে নির্বাহ করা হয় - এর অর্থ '/ দেব / স্টিডিন'। পাইপ এবং এসএসএস উভয় প্রক্রিয়া সংযুক্ত করে। আরও জানার জন্য unix.stackexchange.com/questions/16357/… দেখুন।
রিচার্ড মেটজলার

22

Bzip2 সংক্ষেপণের সাথে টারটি নেটওয়ার্ক এবং সিপিইউতে যতটা লোড নিতে হবে।

$ tar -C /path/to/src/dir -jcf - ./ | ssh user@server 'tar -C /path/to/dest/dir -jxf -'

ব্যবহার করা হচ্ছে না -vকারণ স্ক্রিন আউটপুট প্রক্রিয়াটি ধীর করতে পারে। তবে আপনি যদি কোনও ভার্বোস আউটপুট চান তবে -jcvfএটি দূরবর্তী অংশে নয়, টারের স্থানীয় দিকে ব্যবহার করুন ।

আপনি যদি একই গন্তব্য পথে বার বার অনুলিপি করেন তবে ব্যাকআপ কপি আপডেট করার মতো, আপনার সেরা পছন্দটি কম্প্রেশন সহ আরএসইএনসি।

$ rsync -az -e ssh /path/to/src/dir/ user@server:/path/to/dest/dir/

লক্ষ্য করুন যে src এবং গন্তব্য পথ উভয়ই একটি / দিয়ে শেষ হয়। আবার, ব্যবহার না করে -vএবং -Pউদ্দেশ্য অনুসারে পতাকাগুলি, আপনার ভার্বোজ আউটপুট প্রয়োজন হলে এগুলি যুক্ত করুন।


16

ব্যবহার করুন rsync, এটি এসএসএইচ ব্যবহার করে।

ব্যবহার:

rsync -aPz /source/path destination.server:remote/path

আরএসআইএনসি সুইচগুলি সংক্ষেপণ এবং আই-নোড তথ্য সম্পর্কে যত্নশীল। -Pপ্রতিটি ফাইলের অগ্রগতি প্রদর্শন করে।

আপনি ব্যবহার করতে পারেন scp -C, যা সংক্ষেপণ সক্ষম করে, তবে সম্ভব হলে ব্যবহার করুন rsync


দুর্ভাগ্যক্রমে, rsync সোর্স মেশিনে উপলভ্য নয় এবং এসএসডিও নয়।
এনমিকহেলস

1
ক্লায়েন্ট মেশিনে এই ক্রিয়াকলাপগুলির জন্য sshd প্রয়োজনীয় নয়।
পোলেমন

3

আপনি tarssh ব্যবহার করে উভয় প্রান্তে চালাতে পারেন । মঙ্গলভাবের পরিবারের scpঅংশ ssh, সুতরাং আপনার সম্ভবত এটি উভয় প্রান্তে রয়েছে।

 8:03AM 12 % tar cf - some_directory | ssh dest_host "tar xf -"

নেটওয়ার্ক ট্র্যাফিকও কমিয়ে দিতে পাইপলাইনে জিজিপ বা বিজিপ 2 কাজ করার উপায় থাকতে পারে।


3

@ পিডিওর উত্তরটি ভাল, তবে একটি বাফার এবং ভাল সংকোচনের সাহায্যে গতি বাড়াতে পারে এবং একটি অগ্রগতি বার যুক্ত করতে পারে।

প্রায়শই নেটওয়ার্কটি হ'ল বাধা এবং সময়ের সাথে সাথে গতিও পরিবর্তিত হয়। অতএব, এটি নেটওয়ার্কে ডেটা পাঠানোর আগে ডেটা বাফার করতে সহায়তা করে। এটি দিয়ে করা যেতে পারে pv

অতিরিক্তভাবে, একটি যথাযথ সংক্ষেপণ অ্যালগরিদম দিয়ে গতি বাড়াতে পারে। জিজিপ (উপরে ব্যবহৃত মত) একটি দ্রুত সংক্ষেপণ অ্যালগরিদম, তবে সাধারণভাবে zstandard ( zstd) (এবং উচ্চ সংকোচন অনুপাতের জন্য LZMA / LZMA2 ( xz) আরও ভালভাবে সংকোচিত হবে এবং একই সাথে দ্রুত হবে New নতুন xz এবং zstd এর মধ্যে ইতিমধ্যে নির্মিত মাল্টি কোর সমর্থন রয়েছে । একাধিক কোর সহ জিজেপ ব্যবহার করতে পিগজ ব্যবহার করা যেতে পারে।

একটি নেটওয়ার্কের মাধ্যমে অগ্রগতি বার, বাফারিং এবং জাস্ট স্ট্যান্ডার্ড সংকোচনের সাথে ডেটা প্রেরণের উদাহরণ এখানে রয়েছে:

tar cf - . | pv -perabs $(du -sk . | cut -f 1)K | zstd -14 --long=31 -T0 | pv -qCB 512M | ssh user@host "cd /wherever && pv -qCB 512M | zstd -cd -T0 --long=31 | tar xf -"

প্রথমটি pvহল অগ্রগতি ( পি ), আনুমানিক সময় ( ), স্থানান্তর হার ( আর ), গড় হার ( ), মোট স্থানান্তরিত বাইট ( ) show মোট আকারটি অনুমান করা হয় duএবং আকার বিকল্প ( গুলি ) এ যুক্ত করা হয়। সংক্ষেপণ এবং বাফারিংয়ের আগে অগ্রগতি পরিমাপ করা হয়, সুতরাং এটি খুব সঠিক নয়, তবে এখনও সহায়ক।

zstdসংক্ষেপে সেটিং 14 ব্যবহার করা হয় । নেটওয়ার্ক এবং সিপিইউ গতির উপর নির্ভর করে এই সংখ্যাটি হ্রাস বা বাড়ানো যেতে পারে তাই নেটওয়ার্কের গতির চেয়ে zstd কিছুটা দ্রুত। একটি Haswell 3.2 গিগাহার্জ সিপিইউ চার কোর সঙ্গে 14 প্রায় 120 মেগাবাইট / সেকেন্ড এর গতি দেয়। উদাহরণস্বরূপ, লং মোডে 31 (2 গিগাবাইট উইন্ডো ব্যবহার করে, প্রচুর র‍্যামের প্রয়োজন হয়, তবে খুব ভাল উদাহরণস্বরূপ ডাটাবেস ডাম্পগুলি সংকুচিত করতে) ব্যবহৃত হয়। T0 অপশন কোর সংখ্যা থ্রেডের পরিমাণ সেট করে। একটি সচেতন হওয়া উচিত যে দীর্ঘ মোডের সাথে এই সেটিংসটি প্রচুর মেমরি ব্যবহার করে।

জেডএসটিডি সহ একটি সমস্যা হ'ল বেশিরভাগ অপারেটিং সিস্টেমগুলি> = 1.3.4 সংস্করণে পাঠানো হয় না। এই সংস্করণটি সঠিক মাল্টি কোর এবং দীর্ঘ সমর্থনের জন্য প্রয়োজনীয়। পাওয়া যায় না, এটা কম্পাইল থেকে ইনস্টল করা যাবে https://github.com/facebook/zstd শুধু সঙ্গে make -j4 && sudo make install। জেডএসটিডি এর পরিবর্তে, কেউ এক্স জেড বা পিগজ ব্যবহার করতে পারে। এক্সজেড স্লো তবে কমপ্রেসগুলি খুব ভাল (ধীর সংযোগের চেয়ে ভাল), পিগজ / জিজিপ দ্রুত তবে কম্রেসগুলি এতটা ভাল নয় not pvএরপরে আবার ব্যবহৃত হয়, তবে বাফারিংয়ের জন্য ( qশান্ত Cজন্য, কোনও বিচ্ছিন্ন মোডের জন্য [সর্বদা বাফারিংয়ের জন্য প্রয়োজন]] এবং Bবাফারের আকার নির্ধারণ করার জন্য।

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


2

আপনার যদি উভয় প্রান্তে জিপিপ থাকে: sourcehost$ cd sourcedir && tar cf - . | gzip -c - | ssh user@destinationhost "cd destinationdir && gzip -c -d | tar xf -"

যদি আপনার সোর্স মেশিনে গিজিপ না থাকে তবে নিশ্চিত করুন যে আপনার গন্তব্যটিতে সঙ্কুচিত রয়েছে: sourcehost$ cd sourcedir && tar cf - . | compress | ssh user@destinationhost "cd destdir && uncompress | tar xf -"

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


2

বা আপনার প্রয়োজন হলে আপনি এটি অন্য উপায়ে করতে পারেন। এটি নেটওয়ার্কের উপরে টার্বলকে টানিয়ে রাখার চেয়ে ধাক্কা দেওয়ার চেয়ে পরামর্শ দেওয়া হয়েছে। এটি আপনার প্রশ্নের পুনরাবৃত্তি অংশটি সমাধান করে না এবং আরএসসিএনসি এটির জন্য সেরা তবে সাহায্যের জন্য সম্ভবত টার সুইচ রয়েছে।

স্থানীয় মেশিনে:

ssh remote 'tar zcf - /etc/resolv.conf' | tar zxf -

প্রথমে সঠিক ডিরেক্টরিতে থাকা সেরা বা আপনাকে শেষে সিটি সুইচ ব্যবহার করতে হবে unt

এটি প্রয়োজন হলে কেবল এটি উল্লেখ করা। এটি আমার ক্ষেত্রে যেমন আমার স্থানীয় সার্ভার নেটের পিছনে রয়েছে, তাই পূর্বে উল্লিখিতভাবে যেভাবে এটি করতে সক্ষম হতে কিছু নেটওয়ার্ক ফিউজিং গ্রহণ করবে।

আছে HTH


1

অথবা sshfs এর মাধ্যমে দূরবর্তী ফাইল সিস্টেমটি মাউন্ট করুন

sshfs user@remotehost:/path/on/remote /path/on/local

1

যদিও এটি সবচেয়ে মার্জিত নয়, বিশেষত যেহেতু এটি একটি একক জিপ বা টার ফাইলটি অনুলিপি করছে না এবং দ্বিগুণভাবে যাতে এটি নেটওয়ার্কের ওভারহেড হ্রাস করতে সহায়তা করে না, আমার একমাত্র পছন্দটি ছিল scp -r:

-r

      পুনরাবৃত্তভাবে সম্পূর্ণ ডিরেক্টরি কপি। দ্রষ্টব্য যে scp গাছের নিচু জায়গায় প্রতীকী লিঙ্কগুলি অনুসরণ করেছে।
সূত্র: scp (1)

আমি 30 গিগাবাইট জিপড টার ফাইল সহ ডিস্কের জায়গার বাইরে চলে যাওয়াকে কেন্দ্র করে আসছি। আমি ভেবেছিলাম বন্দুকদ্বার এটি ইনলাইন করতে পারে, অর্থাত্ আনজিপ করা হচ্ছিল বলে আসলটি সরিয়ে ফেলুন (এবং আমি গুগলের ফলাফলটি মিস করতে পারি) তবে আমি কিছুই পাইনি।

অবশেষে, কারণ আমি নতুন টিআর বা জিপ ফাইলটি টেরিং বা জিপ করা শেষ করতে অপেক্ষা করতে করতে একাধিকবার চেষ্টা করে ক্লান্ত হয়ে পড়েছিলাম শেষ পর্যন্ত:

  1. আসল সার্ভার / পিসি / ল্যাপটপ থেকে ডিরেক্টরিতে নেভিগেট করুন যেখানে অসংখ্য ফাইল / ফোল্ডার সহ আপনার ফোল্ডার রয়েছে।
  2. scp -r source_folder_name yourname@yourservername:destination_folder_name

তারপরে কিছু বিয়ার, কফি বা পপকর্ন ধরুন এবং অপেক্ষা করুন। ভাল কথা হ'ল, নেটওয়ার্ক সংযোগ "স্টল" থাকলে scp আবার চেষ্টা করবে। শুধু আশা করি এটি পুরোপুরি নেমে যাবে না।


ঠিক আছে, এটি হাজার scpকমান্ড টাইপ করার চেয়ে আপনার স্পষ্টভাবে কম সময় নেয় । তবে প্রশ্নটি "নেটওয়ার্ক ওভারহেড" সম্পর্কে জিজ্ঞাসা করে। আপনার সমাধান নেটওয়ার্ক পৃথকভাবে প্রতিটি ফাইল অনুলিপি করার চেয়ে কম ব্যবহার করে? ইতিমধ্যে পোস্ট করা সাতটি থেকে কী কী কোনওভাবে আপনার সমাধান উচ্চতর?
জি ম্যান

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