লিনাক্স কমান্ড লাইন থেকে এস 3 অ্যাকাউন্টে ফাইলগুলি আপলোড করা হচ্ছে


74

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

লিনাক্স কমান্ড লাইনের মাধ্যমে আমি কীভাবে এটি "আপলোড" করতে পারি? অথবা লিনাক্সের সাথে কাজ করা কোনও ওয়েবসাইটের মাধ্যমে আমি এটি অ্যাক্সেস করতে পারি?

উত্তর:


30

এস 3 সিএমডি আপনি যা চান তা করে। ফাইল আপলোড এবং ডাউনলোড, ডিরেক্টরি সিঙ্ক এবং বালতি তৈরি।

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


একটি যাদুমন্ত্র মত কাজ করে!
সিলিকনপি

97

আমাজন এখন তাদের নিজস্ব সি এল এল সরঞ্জাম সরবরাহ করে।

Http://aws.amazon.com/cli/ থেকে

পরিচিত সিনট্যাক্স ব্যবহার করে, আপনি ডিরেক্টরি ভিত্তিক তালিকায় আপনার এস 3 বালতির সামগ্রী দেখতে পারেন।

$ aws s3 ls s3://mybucket
      LastWriteTime     Length Name
      -------------     ------ ----
                           PRE myfolder/
2013-09-03 10:00:00       1234 myfile.txt
...

আপনি একক ফোল্ডার-স্তর কমান্ডে পুনরাবৃত্ত আপলোড এবং একাধিক ফাইলের ডাউনলোড সম্পাদন করতে পারেন। AWS CLI বর্ধিত পারফরম্যান্সের জন্য সমান্তরালে এই স্থানান্তরগুলি পরিচালনা করবে।

$ aws s3 cp myfolder s3://mybucket/myfolder --recursive
upload: myfolder/file1.txt to s3://mybucket/myfolder/file1.txt
upload: myfolder/subfolder/file1.txt to s3://mybucket/myfolder/subfolder/file1.txt
...

একটি সিঙ্ক কমান্ড একটি স্থানীয় ফোল্ডারের সামগ্রীগুলিকে একটি এস 3 বালতিতে অনুলিপি সহ সুসংগত করতে সহজ করে তোলে।

$ aws s3 sync myfolder s3://mybucket/myfolder --exclude *.tmp
upload: myfolder/newfile.txt to s3://mybucket/myfolder/newfile.txt
...

ফাইল সম্পর্কিত কমান্ডের জন্য ডকুমেন্টেশন এখানে


5
সবচেয়ে সম্পূর্ণ উত্তর! :)
সার্জিওফিলহ

26

আপনি যদি না করতে পারেন (সম্ভবত আপনি একটি ভাগ্যবান হোস্টে আছেন) বা অতিরিক্ত সরঞ্জাম ইনস্টল করতে না চান তবে কেবল ব্যাশ, কার্ল এবং ওপেনসেল ব্যবহার করা সম্ভব।

http://tmont.com/blargh/2014/1/uploading-to-s3-in-bash

file=/path/to/file/to/upload.tar.gz
bucket=your-bucket
resource="/${bucket}/${file}"
contentType="application/x-compressed-tar"
dateValue=`date -R`
stringToSign="PUT\n\n${contentType}\n${dateValue}\n${resource}"
s3Key=xxxxxxxxxxxxxxxxxxxx
s3Secret=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
signature=`echo -en ${stringToSign} | openssl sha1 -hmac ${s3Secret} -binary | base64`
curl -L -X PUT -T "${file}" \
  -H "Host: ${bucket}.s3.amazonaws.com" \
  -H "Date: ${dateValue}" \
  -H "Content-Type: ${contentType}" \
  -H "Authorization: AWS ${s3Key}:${signature}" \
  https://${bucket}.s3.amazonaws.com/${file}

নোট করুন যে আমি এই লিপিটি উপরের লিঙ্কের একটি থেকে পরিবর্তন করেছি। আমি -Lবিকল্পটি যুক্ত করেছি কারণ এডাব্লুএস সেখানে একটি পুনর্নির্দেশ সন্নিবেশ করতে পারে। -Lবিকল্প তোমার জন্য পুনর্নির্দেশ অনুসরণ করা হবে।

অন্য একটি সতর্কতা। এটি 5GB এর চেয়ে বড় ফাইলগুলির জন্য কাজ করবে না। এগুলির জন্য একটি বহু-অংশ আপলোড প্রয়োজন যা আরও জটিল স্ক্রিপ্টের প্রয়োজন।


12

একটি পসিক্স-কমপ্লায়েন্ট শেল স্ক্রিপ্ট যার জন্য কেবল ওপেনসেল, কার্ল এবং সেড প্রয়োজন; AWS স্বাক্ষর সংস্করণ 4 সমর্থন করে, যা অঞ্চলের eu-central-1(ফ্রাঙ্কফুর্ট) জন্য প্রয়োজনীয় এবং অন্যদের জন্য প্রস্তাবিত:

https://gist.github.com/vszakats/2917d28a951844ab80b1

#!/bin/sh -u

# To the extent possible under law, Viktor Szakats (vszakats.net)
# has waived all copyright and related or neighboring rights to this
# script.
# CC0 - https://creativecommons.org/publicdomain/zero/1.0/

# Upload a file to Amazon AWS S3 using Signature Version 4
#
# docs:
#    https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html
#
# requires:
#    curl, openssl 1.x, GNU sed, LF EOLs in this file

fileLocal="${1:-example-local-file.ext}"
bucket="${2:-example-bucket}"
region="${3:-}"
storageClass="${4:-STANDARD}"  # or 'REDUCED_REDUNDANCY'

m_openssl() {
  if [ -f /usr/local/opt/openssl@1.1/bin/openssl ]; then
    /usr/local/opt/openssl@1.1/bin/openssl "$@"
  elif [ -f /usr/local/opt/openssl/bin/openssl ]; then
    /usr/local/opt/openssl/bin/openssl "$@"
  else
    openssl "$@"
  fi
}

m_sed() {
  if which gsed > /dev/null 2>&1; then
    gsed "$@"
  else
    sed "$@"
  fi
}

awsStringSign4() {
  kSecret="AWS4$1"
  kDate=$(printf         '%s' "$2" | m_openssl dgst -sha256 -hex -mac HMAC -macopt "key:${kSecret}"     2>/dev/null | m_sed 's/^.* //')
  kRegion=$(printf       '%s' "$3" | m_openssl dgst -sha256 -hex -mac HMAC -macopt "hexkey:${kDate}"    2>/dev/null | m_sed 's/^.* //')
  kService=$(printf      '%s' "$4" | m_openssl dgst -sha256 -hex -mac HMAC -macopt "hexkey:${kRegion}"  2>/dev/null | m_sed 's/^.* //')
  kSigning=$(printf 'aws4_request' | m_openssl dgst -sha256 -hex -mac HMAC -macopt "hexkey:${kService}" 2>/dev/null | m_sed 's/^.* //')
  signedString=$(printf  '%s' "$5" | m_openssl dgst -sha256 -hex -mac HMAC -macopt "hexkey:${kSigning}" 2>/dev/null | m_sed 's/^.* //')
  printf '%s' "${signedString}"
}

iniGet() {
  # based on: https://stackoverflow.com/questions/22550265/read-certain-key-from-certain-section-of-ini-file-sed-awk#comment34321563_22550640
  printf '%s' "$(m_sed -n -E "/\[$2\]/,/\[.*\]/{/$3/s/(.*)=[ \\t]*(.*)/\2/p}" "$1")"
}

# Initialize access keys

if [ -z "${AWS_CONFIG_FILE:-}" ]; then
  if [ -z "${AWS_ACCESS_KEY:-}" ]; then
    echo 'AWS_CONFIG_FILE or AWS_ACCESS_KEY/AWS_SECRET_KEY envvars not set.'
    exit 1
  else
    awsAccess="${AWS_ACCESS_KEY}"
    awsSecret="${AWS_SECRET_KEY}"
    awsRegion='us-east-1'
  fi
else
  awsProfile='default'

  # Read standard aws-cli configuration file
  # pointed to by the envvar AWS_CONFIG_FILE
  awsAccess="$(iniGet "${AWS_CONFIG_FILE}" "${awsProfile}" 'aws_access_key_id')"
  awsSecret="$(iniGet "${AWS_CONFIG_FILE}" "${awsProfile}" 'aws_secret_access_key')"
  awsRegion="$(iniGet "${AWS_CONFIG_FILE}" "${awsProfile}" 'region')"
fi

# Initialize defaults

fileRemote="${fileLocal}"

if [ -z "${region}" ]; then
  region="${awsRegion}"
fi

echo "Uploading" "${fileLocal}" "->" "${bucket}" "${region}" "${storageClass}"
echo "| $(uname) | $(m_openssl version) | $(m_sed --version | head -1) |"

# Initialize helper variables

httpReq='PUT'
authType='AWS4-HMAC-SHA256'
service='s3'
baseUrl=".${service}.amazonaws.com"
dateValueS=$(date -u +'%Y%m%d')
dateValueL=$(date -u +'%Y%m%dT%H%M%SZ')
if hash file 2>/dev/null; then
  contentType="$(file -b --mime-type "${fileLocal}")"
else
  contentType='application/octet-stream'
fi

# 0. Hash the file to be uploaded

if [ -f "${fileLocal}" ]; then
  payloadHash=$(m_openssl dgst -sha256 -hex < "${fileLocal}" 2>/dev/null | m_sed 's/^.* //')
else
  echo "File not found: '${fileLocal}'"
  exit 1
fi

# 1. Create canonical request

# NOTE: order significant in ${headerList} and ${canonicalRequest}

headerList='content-type;host;x-amz-content-sha256;x-amz-date;x-amz-server-side-encryption;x-amz-storage-class'

canonicalRequest="\
${httpReq}
/${fileRemote}

content-type:${contentType}
host:${bucket}${baseUrl}
x-amz-content-sha256:${payloadHash}
x-amz-date:${dateValueL}
x-amz-server-side-encryption:AES256
x-amz-storage-class:${storageClass}

${headerList}
${payloadHash}"

# Hash it

canonicalRequestHash=$(printf '%s' "${canonicalRequest}" | m_openssl dgst -sha256 -hex 2>/dev/null | m_sed 's/^.* //')

# 2. Create string to sign

stringToSign="\
${authType}
${dateValueL}
${dateValueS}/${region}/${service}/aws4_request
${canonicalRequestHash}"

# 3. Sign the string

signature=$(awsStringSign4 "${awsSecret}" "${dateValueS}" "${region}" "${service}" "${stringToSign}")

# Upload

curl -s -L --proto-redir =https -X "${httpReq}" -T "${fileLocal}" \
  -H "Content-Type: ${contentType}" \
  -H "Host: ${bucket}${baseUrl}" \
  -H "X-Amz-Content-SHA256: ${payloadHash}" \
  -H "X-Amz-Date: ${dateValueL}" \
  -H "X-Amz-Server-Side-Encryption: AES256" \
  -H "X-Amz-Storage-Class: ${storageClass}" \
  -H "Authorization: ${authType} Credential=${awsAccess}/${dateValueS}/${region}/${service}/aws4_request, SignedHeaders=${headerList}, Signature=${signature}" \
  "https://${bucket}${baseUrl}/${fileRemote}"

লক্ষ্য করুন, স্ক্রিপ্টটি সার্ভার-সাইড সক্ষম করবে

ডিফল্টভাবে AES256 এনক্রিপশন।


অনুসন্ধান ইঞ্জিনগুলির জন্য: এটি ইউরোপীয় ইউনিয়ন-কেন্দ্রীয় -১ এর সঠিক সমাধান এবং সাধারণভাবে যদি আপনি ত্রুটি পান তবেThe authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256
স্টেইন

3

বিকল্পভাবে আপনি https://github.com/minio/mc চেষ্টা করতে পারেন

mcঅ্যামাজন এস 3 সামঞ্জস্যপূর্ণ ক্লাউড স্টোরেজ এবং ফাইল সিস্টেমগুলির সাথে কাজ করার জন্য ন্যূনতম সরঞ্জাম সরবরাহ করে। এটিতে পুনরায় শুরুযোগ্য আপলোডস, প্রগতি বার, সমান্তরাল অনুলির মতো বৈশিষ্ট্য রয়েছে। mcগোলাংয়ে লিখিত এবং অ্যাপাচি লাইসেন্স ভি 2 এর অধীনে প্রকাশিত হয়েছে।


এটি একটি দুর্দান্ত উত্তর। অন্যান্য (ভাল) উত্তরগুলি যেমন পরামর্শ দিচ্ছে তেমনভাবে আমি এটি ব্যাশে করতে চাই না। আমি কেবল সমস্ত স্ক্রিন নির্ভরতা ইনস্টল করতে চাই না aw
মাইকেল বার্টন

1

S3 এ ডেটা আপলোড করার জন্য সহায়ক হিসাবে আমি botoপ্যাকেজটিতে পাইথনের AWS বাইন্ডিংগুলি পেয়েছি foundpip install boto

নিম্নলিখিত স্ক্রিপ্টটি এর মতো বলা যেতে পারে: python script_name.py "sub_bucket_name" "*.zip"যেখানে sub_bucket_nameডিরেক্টরিটি S3 তে ফাইলগুলি সংরক্ষণ করতে হবে সেই ডিরেক্টরিটির নাম নির্দেশ করে এবং *.zipএক বা একাধিক ফাইল আপলোড করার জন্য একটি গ্লোব পাথ রয়েছে:

import sys, glob, os, boto
from boto.s3.key import Key

def percent_cb(complete, total):
    sys.stdout.write('.')
    sys.stdout.flush()

id = '< your id here >'               # AWS Access Key ID
secret = '< your secret here >'       # AWS Secret Access Key
bucket_name = '< your bucket here >'  # Bucket wherein content will be stored
conn = boto.connect_s3(id, secret)    # Establish a connection to S3
bucket = conn.get_bucket(bucket_name, validate=False)  # Connect to bucket
k  = Key(bucket)                      # Connect to the bucket's key

for i in glob.glob(sys.argv[2]):      # Read in files to push to S3

        sub_bucket = sys.argv[1]  # Directory within bucket where files will be stored
        k.key = sub_bucket + "/" + os.path.basename(i) # Path each uploaded file will have on S3

        k.set_contents_from_filename(i, cb=percent_cb, num_cb=10)  # Push data to S3

        print 'Uploading %s to Amazon S3 bucket %s' % (i, bucket_name)  # Report status
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.