Linux komut satırından S3 hesabına dosya yükleme


74

Linux tarafından barındırılan hesabımda S3 hesabıma yüklemem gereken birçok büyük dosyam var. Önce onları indirmek ve sonra S3'e yüklemek istemiyorum.

Linux komut satırı üzerinden "yükleyebilmemin" herhangi bir yolu var mı? Veya Lynx ile çalışan bir web sitesi aracılığıyla erişebilir miyim?

Yanıtlar:


30

S3cmd ne istiyorsa onu yapar. Dosya yükleme ve indirme, dizinleri senkronize etme ve kova oluşturma.

S3cmd, Amazon S3 ve Google Cloud Storage veya DreamHost DreamObjects gibi S3 protokolünü kullanan diğer bulut depolama hizmeti sağlayıcılarına veri yüklemek, almak ve yönetmek için kullanılan ücretsiz bir komut satırı aracı ve istemcisidir. Komut satırı programlarına aşina olan uzman kullanıcılar için en uygun yöntemdir. Ayrıca toplu komut dosyaları ve S3'ten cron vb. İle tetiklenen otomatik yedekleme için de idealdir.


tıkır tıkır çalışıyor!
siliconpi

97

Amazon artık kendi CLI araçlarını da sunmaktadır.

Http://aws.amazon.com/cli/ adresinden

Bilinen sözdizimini kullanarak, S3 kovalarınızın içeriğini dizin tabanlı bir listede görüntüleyebilirsiniz.

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

Tek bir klasör düzeyinde komut ile özyinelemeli yükleme ve birden fazla dosya indirme işlemi gerçekleştirebilirsiniz. AWS CLI, bu transferleri artan performans için paralel olarak yürütecektir.

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

Bir senkronizasyon komutu, yerel bir klasörün içeriğini bir S3 kovasında kopya ile senkronize etmeyi kolaylaştırır.

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

Dosyayla ilgili komutların belgeleri burada .


5
en eksiksiz cevap! :)
SergioFilhow

26

Yapamıyorsanız (belki de paylaşılan bir ana makinedeyseniz) veya fazladan araç yüklemek istemiyorsanız, bash, curl ve openssl komutlarını kullanmak mümkündür.

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}

Bu betiği yukarıdaki bağlantıdaki bölümden değiştirdiğimi unutmayın. Bu -Lseçeneği ekledim çünkü AWS oraya bir yönlendirme ekleyebilir. Bu -Lseçenek sizin için yönlendirmeyi izleyecektir.

Başka bir uyarı. Bu 5GB'tan büyük dosyalar için işe yaramaz. Bunlar daha karmaşık bir komut dosyası gerektiren çok parçalı bir yükleme gerektirir.


12

Yalnızca openssl, curl ve sed gerektiren bir POSIX uyumlu kabuk betiği; bölge eu-central-1(Frankfurt) için gerekli olan ve diğerleri için önerilen AWS İmza Sürüm 4'ü desteklemek :

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}"

Dikkat edin, komut dosyası sunucu tarafında etkin olacak

AES256 şifreleme varsayılan olarak.


Arama motorları için: Bu, eu-central-1 için doğru bir çözümdür ve genel olarak hatayı alırsanızThe authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256
Steen

3

Alternatif olarak, https://github.com/minio/mc adresini deneyebilirsiniz.

mcAmazon S3 uyumlu bulut depolama ve dosya sistemleriyle çalışmak için minimal araçlar sağlar. Yeniden başlatılabilir yüklemeler, ilerleme çubuğu, paralel kopya gibi özelliklere sahiptir. mcGolang'da yazılmıştır ve Apache v2 lisansı altında yayınlanmıştır.


Bu harika bir cevap. Diğer (iyi) cevapların öne sürdüğü gibi, kesinlikle bash yapmak istemiyorum. Sadece awscli'nin gerektirdiği tüm bağımlılıkları kurmak istemiyorum.
Michael Barton,

1

S3'e veri yüklemek için Python'un AWS bağlantılarını boto( pip install boto) pakette buldum .

Aşağıdaki komut dosyası şöyle çağrılabilir: python script_name.py "sub_bucket_name" "*.zip"nerede sub_bucket_namedosyaların S3'te depolanması gereken dizinin adını belirtir ve *.zipyüklenecek bir veya daha fazla dosyayı belirleyen bir genel yoldur:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.