আমি সরাসরি একটি দূরবর্তী মেশিনে কমান্ডের (বিশাল) আউটপুট কীভাবে স্ক্রিপ করব?


50

মনে রাখবেন যে আমি প্রথমে স্থানীয়ভাবে ফাইলটি সঞ্চয় করতে পারি না - এটি অনেক বড়।

এই (অযৌক্তিক) পৃষ্ঠাটি (নীচে সমস্ত দিকে স্ক্রোল করা) একটি উত্তর দিয়েছে বলে মনে হচ্ছে তবে টেপ ড্রাইভের সাথে নির্দিষ্ট অংশটি বিচ্ছিন্ন করতে আমার সমস্যা হচ্ছে:

http://webcache.googleusercontent.com/search?q=cache:lhmh960w2KQJ:www.experts-exchange.com/OS/Unix/SCO_Unix/Q_24249634.html+scp+redirect&cd=3&hl=en&ct=clnk&gl=us

এই আরো কংক্রিট তৈরি করতে হলে, এখানে আপনি কিভাবে এটা মনে হবে এর পারে কাজ:

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

% echo "pretend this string is a huge amt of data" | scp - remote.com:big.txt

(এটি কনভেনশনটি ব্যবহার করছে - যা scp আসলে সমর্থন করে না - উত্স ফাইলটির পরিবর্তে স্ট্যাডিনের কাছ থেকে এটি পাওয়ার জন্য ড্যাশ প্রতিস্থাপন করে of)


আপনি কি নিজের গুগলের ফলাফলের ইউআরএল পোস্ট করতে পারবেন? বিশেষজ্ঞের এক্সচেঞ্জ কেবলমাত্র নীচে উত্তরটি দেখায় যদি আপনার রেফারার গুগল হয় ...
জন

উত্তর:


76

আপনি ssh এ পাইপ করতে এবং একটি রিমোট কমান্ড চালাতে পারেন। এই ক্ষেত্রে, রিমোট কমান্ড হ'ল cat > big.txtস্ট্যান্ডিন big.txtফাইলটিতে অনুলিপি করবে ।

echo "Lots of data" | ssh user@example.com 'cat > big.txt'

এটি যত সহজ আপনি দূরবর্তী প্রান্তে সংযোগ করতে ssh ব্যবহার করতে পারবেন ততক্ষণ সহজ এবং সোজা straight

আপনি ncডেটা স্থানান্তর করতে (নেটটাক) ব্যবহার করতে পারেন । রিসিভিং মেশিনে (উদাঃ, হোস্ট.অ্যাম্পেল.কম):

nc -l 1234 > big.txt

এটি nc1234 পোর্ট শোনার জন্য সেট আপ করবে এবং সেই বন্দরে প্রেরিত যে কোনও কিছুই big.txtফাইলটিতে অনুলিপি করবে । তারপরে, প্রেরণ মেশিনে:

echo "Lots of data" | nc host.example.com 1234

এই কমান্ডটি ncপ্রেরণকারীকে প্রেরণকারীটিতে 1234 পোর্টের সাথে সংযোগ স্থাপন করতে এবং নেটওয়ার্ক জুড়ে স্টিডিন থেকে ডেটা অনুলিপি করার জন্য বলবে ।

তবে ncসমাধানটির কয়েকটি ডাউনসাইড রয়েছে:

  • কোনও প্রমাণীকরণ নেই; যে কেউ 1234 পোর্টের সাথে সংযোগ করতে এবং ফাইলে ডেটা প্রেরণ করতে পারে।
  • ডেটা এনক্রিপ্ট করা হয় না, যেমন এটি হবে ssh
  • যদি উভয়ই মেশিন ফায়ারওয়ালের পিছনে থাকে তবে সংযোগটি যথাযথভাবে চালিত করার জন্য এবং বিশেষত প্রাপ্তির শেষে, বেছে নেওয়া বন্দরটি খোলা থাকতে হবে to
  • উভয় প্রান্তটি স্বাধীনভাবে এবং একযোগে সেট আপ করতে হবে। সঙ্গে sshসমাধান, আপনি এন্ড পয়েন্ট মাত্র এক থেকে ট্র্যান্সফার শুরু করতে পারেন।

যদি এটি কোনও সান্ত্বনা থাকে তবে আমি আপনার গৃহীত হিসাবে চিহ্নিত হতে আগ্রহী কারণ এটি আসলে কী চলছে তা সুন্দরভাবে ব্যাখ্যা করে। (আপনি যদি সত্যিই এটি
ছিনিয়ে

সম্পন্ন. নেটকাট হ্যান্ডি ইউটিলিটি। :)
ব্যারি ব্রাউন

অন্যান্য মন্তব্যের মতো, আপনি যদি tar -cvzf >(ssh destination 'cat > file') huge_directory_tree
টারের

1
এসএসএইচ আসলেই যাওয়ার উপায়। এর তুলনায় ncডিফল্টরূপে এবং আরও গুরুত্বপূর্ণভাবে: আপনার ডেটা এনক্রিপশন এবং সংক্ষেপণের প্রস্তাব দেয় ত্রুটি-সনাক্তকরণ। আমার এমন পরিস্থিতি হয়েছিল যেখানে আমি ncত্রুটিযুক্ত নেটওয়ার্ক ড্রাইভারের সাথে ব্যবহার করেছি এবং দূষিত ডেটা সনাক্ত করা যায় না। এসএসএইচ সেই পরিস্থিতিতে ব্যর্থ হবে, কারণ এটি ত্রুটিযুক্ত ডেটা ডিক্রিপ্ট / ডিসক্রপ্রেস করতে পারে না।
jlh

15

Ssh ব্যবহার:

echo "pretend this is a huge amt of data" | ssh user@remote.com 'cat > big.txt'

আহ, সুন্দর, আপনাকে ধন্যবাদ! এই বা FIFO পাইপ সমাধান পছন্দ করার কোনও কারণ?
dreeves

আমি মনে করি mknod পদ্ধতির নাম ঠিক করা পাইপ ব্যতীত ঠিক একইভাবে কার্য সম্পাদন করে।
বিপিএফ

4

এনসি (নেট বিড়াল) ব্যবহার করুন , যা স্থানীয়ভাবে ফাইল সংরক্ষণ করার প্রয়োজন নেই।


আহ, ধন্যবাদ! আমার "প্রতিধ্বনি .. | scp .." উদাহরণের সমতুল্য অন্তর্ভুক্ত করতে চান? এবং অন্যান্য কারণগুলির চেয়ে আপনি এটি পছন্দ করতে জানেন?
dreeves

2
আমি দৃ ncfor ়ভাবে এই জন্য ব্যবহার বিরুদ্ধে সুপারিশ । আমি একবারে একটি কাঁচা ডিস্ক চিত্রটি একটি মেশিন থেকে অন্য মেশিনে ফেলেছিলাম কেবল তার পরে আমার নেটওয়ার্ক ড্রাইভারটি ত্রুটিযুক্ত এবং ত্রুটিযুক্ত বিট স্থানান্তরিত হয়েছিল তা জানতে। ব্যবহারের scp, sshবা অন্য কিছু যে আপনার যখন একটি সংক্রমণ ত্রুটি বলে দেবে।
jlh

2

একটি ফিফো পাইপ ব্যবহার করুন:

mknod mypipe p
scp mypipe destination &
ls > mypipe

আমি এটি লিনাক্স সিস্টেমে কাজ করতে পারি না। scpমাইপাইপ কোনও নিয়মিত ফাইল নয় বলে অভিযোগ করেছিলেন।
ব্যারি ব্রাউন

1
একই কারণে কোনও ম্যাকে কাজ করেনি। ( mkfifoযদিও পাইপটি তৈরি করতে আমাকে ব্যবহার করতে হয়েছিল))
ব্যারি ব্রাউন

1
এখানেও কাজ হয়নি। তবে যদি এটি আপনার পক্ষে কাজ করে এবং আপনার কাছে বাশ বা জেড রয়েছে, তবে আপনি উদাহরণস্বরূপ যেমন প্রক্রিয়া প্রতিস্থাপনের মাধ্যমে এটি অর্জন করতে পারতেন:scp <(ls) destination
তাইউই

1

থানেক্স ডেনিস শেরবাকভ!

আমি যখন তোমার স্ক্রিপ্টটি হেটজনার ক্লাউডে চেষ্টা করেছি তখন

debug1: Sending command: scp -v -t backup-20180420120524.tar.xz.enc
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: channel 0: free: client-session, nchannels 1
debug1: fd 0 clearing O_NONBLOCK
Transferred: sent 4168, received 2968 bytes, in 0.0 seconds
Bytes per second: sent 346786.6, received 246944.0

তবে কেবল কোনও সামগ্রী নেই এমন একটি ফাইল তৈরি হয়েছিল। যেহেতু প্রকৃত সামগ্রীটি ইতিমধ্যে ওপেনএসএল দ্বারা এনক্রিপ্ট করা আছে, আমাদের আসলে স্ক্যাপের দরকার নেই। লিনাক্স বিল্টিনে ftpদুর্দান্ত পাইপিং ক্ষমতাও রয়েছে। সুতরাং এখানে আমার (এখনও বেশ ম্যানুয়াল) সমাধান:

#!/bin/bash

function join_e
{
  for word in $*; do
    echo -n "--exclude=$word "
  done
}


# Directory and file inclusion list
ILIST=(
  /home
)

# Directory and file exclusion list
ELIST=(
  var/lib/postgresql
)



export OPASS=fileencryptionpassword

nice -n 19 bash -c \
   "\
   tar $(join_e ${ELIST[@]}) -cpvf - -C / ${ILIST[*]} \
   | xz -c9e -T8 \
   | openssl enc -aes-256-cbc -pass env:OPASS \
   "

# decrypt with:
# cat backup.tar.xz.enc | openssl  aes-256-cbc -d  -pass env:OPASS | xz -dc | tar xv

# invocation procedure for ftp:
# $ ftp -np
# ftp> open storage.com
# ftp> user  storageuser storagepass
# ftp> put "| bash ~/backup.sh" backup.tar.xz.enc

1

এখানে একটি বিকল্প সমাধান:

উপরের সমস্ত উদাহরণ ssh + বিড়ালকে বোঝায় যে "বিড়াল" গন্তব্য সিস্টেমে উপলব্ধ।

আমার ক্ষেত্রে সিস্টেমে (হেটজনার ব্যাকআপ) এসএফটিপি সরবরাহকারী সরঞ্জামগুলির একটি খুব সীমাবদ্ধ সেট ছিল, তবে সম্পূর্ণ শেল নয়। সুতরাং ssh + cat ব্যবহার করা সম্ভব ছিল না। আমি এমন একটি সমাধান নিয়ে এসেছি যা অনথিভুক্ত "scp -t" পতাকা ব্যবহার করে। সম্পূর্ণ স্ক্রিপ্ট নীচে পাওয়া যাবে।

#!/bin/bash

function join_e
{
  for word in $*; do
    echo -n "--exclude=$word "
  done
}

CDATE=`date +%Y%m%d%H%M%S`

# Make password available to all programs that are started by this shell.
export OPASS=YourSecretPasswrodForOpenSslEncryption

#-----------------------------------------------

# Directory and file inclusion list
ILIST=(
  var/lib
)

# Directory and file exclusion list
ELIST=(
  var/lib/postgresql
)

# 1. tar: combine all files into a single tar archive
#      a. Store files and directories in ILIST only.
#      b. Exclude files and directories from ELIST.
# 2. xz: compress as much as you can utilizing 8 threads (-T8)
# 3. openssl: encrypt contents using a password stored in OPASS local environment variable
# 4. cat: concatenate stream with SCP control message, which has to be sent before data
#      a. C0600 - create a file with 600 permissions
#      b. 107374182400 - maximum file size
#         Must be higher or equal to the actual file size.
#         Since we are dealing with STDIN, we have to make an educated guess.
#         I've set this value to 100x times my backups are.
#      c. stdin - dummy filename (unused)
# 5. ssh: connect to the server
#      a. call SCP in stdin (-t) mode.
#      b. specify destination filename

nice -n 19 bash -c \
   "\
   tar $(join_e ${ELIST[@]}) -cpf - -C / ${ILIST[*]} \
   | xz -c9e -T8 \
   | openssl enc -aes-256-cbc -pass env:OPASS \
   | cat <(echo 'C0600 107374182400 stdin') - \
   | ssh username@server.your-backup.de "\'"scp -t backup-${CDATE}.tar.xz.enc"\'"\
   "

আপডেট 2019.05.08:

অনুরোধ অনুসারে, নীচে একটি খুব সহজ এবং সংক্ষিপ্ত সংস্করণ।

#!/bin/sh

# WORKS ON LARGE FILES ONLY

cat filename.ext \
| cat <(echo 'C0600 107374182400 stdin') - \
| ssh user@host.dom 'scp -t filename.ext'

সমস্ত অপ্রয়োজনীয় জিনিস সরিয়ে আপনি কীভাবে এটি ব্যবহার করতে পারবেন তার ন্যূনতম উদাহরণটিতে পেরে এই উন্নতি করতে পারেন scp -t? এই মুহূর্তে আপনার কাছে একটি সম্পূর্ণ স্ক্রিপ্ট রয়েছে যা আপনার পরিবেশে অত্যন্ত কাস্টম / স্থানীয়ীকৃত। হিটজার উইকির জন্য একটি ভাল জিনিস, তবে সুপার ব্যবহারকারীর পক্ষে নয় যেখানে বেশিরভাগ লোকেরা কীভাবে স্ক্র্যাপের মাধ্যমে ইনপুট পাইপ করবেন তা সন্ধান করছেন।
allquixotic
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.