लिनक्स कमांड लाइन से S3 खाते में फाइलें अपलोड करना


74

मुझे अपने लिनक्स होस्टेड खाते में कई बड़ी फाइलें मिली हैं जिन्हें मुझे अपने S3 खाते में अपलोड करने की आवश्यकता है। मैं उन्हें पहले डाउनलोड नहीं करना चाहता और फिर उन्हें S3 में अपलोड करना चाहता हूं।

वहाँ किसी भी तरह से मैं लिनक्स कमांड लाइन के माध्यम से इसे "अपलोड" कर सकता हूं? या मैं लिंक्स के साथ काम करने वाली वेबसाइट के माध्यम से इसे एक्सेस कर सकता हूं?

जवाबों:


30

S3cmd आप क्या चाहते हैं। फ़ाइलें अपलोड करना और डाउनलोड करना, निर्देशिकाओं को सिंक करना और बाल्टियाँ बनाना।

S3cmd, Amazon S3 और अन्य क्लाउड स्टोरेज सर्विस प्रोवाइडर्स को डेटा अपलोड करने, पुनः प्राप्त करने और प्रबंधित करने के लिए एक फ्री कमांड लाइन टूल और क्लाइंट है जो S3 प्रोटोकॉल का उपयोग करता है, जैसे कि Google क्लाउड स्टोरेज या ड्रीमहोस्ट ड्रीमऑब्जेक्ट। यह उन पावर उपयोगकर्ताओं के लिए सबसे उपयुक्त है जो कमांड लाइन प्रोग्राम से परिचित हैं। यह बैच स्क्रिप्ट और S3 के लिए स्वचालित बैकअप के लिए भी आदर्श है, क्रोन से ट्रिगर किया गया, आदि।


एक जादू की तरह काम करता है!
सिलिकॉनपीआई

97

अमेज़ॅन अपने सीएलआई उपकरण अब भी प्रदान करता है।

से http://aws.amazon.com/cli/

परिचित वाक्यविन्यास का उपयोग करके, आप अपने S3 बाल्टी की सामग्री को निर्देशिका-आधारित सूची में देख सकते हैं।

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

आप एकल फ़ोल्डर-स्तर कमांड में कई फ़ाइलों के पुनरावर्ती अपलोड और डाउनलोड कर सकते हैं। एडब्ल्यूएस सीएलआई बढ़े हुए प्रदर्शन के लिए इन तबादलों को समानांतर में चलाएगा।

$ 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
...

एक सिंक कमांड से S3 बाल्टी में एक कॉपी के साथ स्थानीय फ़ोल्डर की सामग्री को सिंक्रनाइज़ करना आसान हो जाता है।

$ 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विकल्प जोड़ा क्योंकि AWS वहां एक रीडायरेक्ट डाल सकता है। -Lविकल्प आपके लिए रीडायरेक्ट का पालन करेंगे।

एक अन्य कैवियट। यह 5GB से बड़ी फ़ाइलों के लिए काम नहीं करेगा। उन लोगों को एक बहु-भाग अपलोड की आवश्यकता होती है जिन्हें अधिक जटिल स्क्रिप्ट की आवश्यकता होती है।


12

एक POSIX- कंप्लीट शेल स्क्रिप्ट जिसमें ओपनसेल, कर्ल और सेड की आवश्यकता होती है; 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 एन्क्रिप्शन।


सर्च इंजन के लिए: यह यूरोप-सेंट्रल -1 के लिए सही समाधान है और सामान्य तौर पर अगर आपको त्रुटि मिलती हैThe authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256
स्टीन

3

वैकल्पिक रूप से आप https://github.com/minio/mc पर कोशिश कर सकते हैं

mcअमेज़ॅन S3 संगत क्लाउड स्टोरेज और फाइल सिस्टम के साथ काम करने के लिए न्यूनतम उपकरण प्रदान करता है। इसमें रिज्यूमेबल अपलोड, प्रोग्रेस बार, पैरेलल कॉपी जैसे फीचर्स हैं। mcगोलांग में लिखा गया है और अपाचे लाइसेंस v2 के तहत जारी किया गया है।


यह एक बेहतरीन जवाब है। मैं जरूरी नहीं कि यह बाश में करना चाहता हूं, क्योंकि अन्य (अच्छे) उत्तर सुझा रहे हैं। मैं सिर्फ उन सभी आश्रितों को स्थापित नहीं करना चाहता जिन्हें अक्स्ली की आवश्यकता है।
माइकल बार्टन २

1

मैंने botoपैकेज में पायथन के AWS बाइंडिंग ( pip install boto) को S3 में डेटा अपलोड करने के लिए मददगार पाया है ।

निम्न स्क्रिप्ट को इस तरह कहा जा सकता है: 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.