2014-12-26 17 views
8

tôi đang cố gắng để có được những kịch bản sau đây bash để làm việc (sao chép từ http://curl.haxx.se/mail/archive-2014-10/0006.html#replies):Tải tập tin cá nhân từ S3 sử dụng bash

#!/bin/sh 
file=path/to/file 
bucket=your-bucket 
resource="/${bucket}/${file}" 
contentType="application/x-compressed-tar" 
dateValue="`date +'%a, %d %b %Y %H:%M:%S %z'`" 
stringToSign="GET 
${contentType} 
${dateValue} 
${resource}" 
s3Key=xxxxxxxxxxxxxxxxxxxx 
s3Secret=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
signature=`/bin/echo -n "$stringToSign" | openssl sha1 -hmac ${s3Secret} -binary |  base64` 
curl -H "Host: ${bucket}.s3.amazonaws.com" \ 
-H "Date: ${dateValue}" \ 
-H "Content-Type: ${contentType}" \ 
-H "Authorization: AWS ${s3Key}:${signature}" \ 
https://${bucket}.s3.amazonaws.com/${file} 

Tôi nhận được một lỗi SignatureDoesNotMatch không có vấn đề gì tôi làm.

Bất kỳ ý tưởng nào về cách sửa lỗi này sẽ được đánh giá cao.

+0

Tôi không biết nếu điều này có liên quan nhưng bạn đã bỏ một dòng mới trong giá trị 'stringToSign' đó. –

+0

Vâng, tôi biết, đó dường như là định dạng bắt buộc. Tôi cũng thử nghiệm mà không có dòng mới, không có không gian, vv Không thành công cho đến nay, nhưng cảm ơn. – UKatz

+0

Bạn đã thử với dòng mới bổ sung giữa 'GET' và loại nội dung? –

Trả lời

7

Sau quá nhiều thời gian dành về vấn đề này cuối cùng tôi đã nhận nó để làm việc:

dòng này:

signature=`/bin/echo -n "$stringToSign" | openssl sha1 -hmac ${s3Secret} -binary | base64` 

thiếu một 'e':

signature=`/bin/echo -en "$stringToSign" | openssl sha1 -hmac ${s3Secret} -binary | base64` 

Nói cách khác , các ký tự không được thoát trước khi chuỗi được ký.

Là một sang một bên, tôi cũng đã học được rằng để nhận được yêu cầu, loại nội dung là vô nghĩa.

+0

Tôi vẫn gặp vấn đề với cách tiếp cận này, tôi đã mô tả nó ở đây -> http: // stackoverflow.com/questions/39745391/authenticate-s3-request-using-authorization-header – mkorszun

+0

Cũng có vấn đề với điều này, tôi viết lại nó ở đây: http://stackoverflow.com/a/40835539/977939 – jpillora

2
bucket=your-bucket-name 
contentType="text/plain" 
dateValue="`date +'%a, %d %b %Y %H:%M:%S %z'`" 
stringToSign="GET\n\n${contentType}\n${dateValue}\n${resource}" 
s3Key=xxxxxx 
s3Secret=xxxxx 
signature=`/bin/echo -en "$stringToSign" | openssl sha1 -hmac ${s3Secret} -binary | base64` 

file1=file-name 
resource1="/${bucket}/${file1}" 
curl -H "Date: ${dateValue}" -H "Content-Type: ${contentType}" -H "Authorization: AWS ${s3Key}:${signature}" "https://s3-us-west-2.amazonaws.com/${resource1}" -o "file-name-to-save-the-output" 

Tôi gặp lỗi trong câu trả lời thực tế. Điều này làm việc cho tôi. Điều này sẽ nhận được các tập tin như những gì nó được và không phải là chuỗi.

1

Nó đòi hỏi sự điều chỉnh nhỏ, nhưng những dòng sau hoạt động tốt

#!/bin/sh 
file=path/to/file 
bucket=your-bucket 
resource="/${bucket}/${file}" 
contentType="application/x-compressed-tar" 
dateValue="`date +'%a, %d %b %Y %H:%M:%S %z'`" 
stringToSign="GET\n\n${contentType}\n${dateValue}\n${resource}" 
s3Key=xxxxxxxxxxxxxxxxxxxx 
s3Secret=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
signature=`/bin/echo -en "$stringToSign" | openssl sha1 -hmac ${s3Secret} -binary | base64` 
curl -H "Host: ${bucket}.s3.amazonaws.com" -H "Date: ${dateValue}" -H "Content-Type: ${contentType}" -H "Authorization: AWS ${s3Key}:${signature}" https://${bucket}.s3.amazonaws.com/${file} 
+0

Nó không hoạt động cho tôi. Có gì sai ở đây? Tôi đang chiến đấu với nó ngày thứ ba ... – mkorszun

4

Sử dụng câu trả lời khác nhau trong chủ đề này, tôi chuyển đổi nó thành một chức năng s3get bash ích:

#!/bin/bash 

#usage - s3get writes the specified object to stdout 
# s3get <bucket/key> [region] 

#set these in your environment/profile (NOT HERE) 
AWS_ACCESS_KEY="" 
AWS_SECRET_KEY="" 

#example usage 
s3get my-bucket/a/path/to/my/file > /tmp/file 

function s3get { 
    #helper functions 
    function fail { echo "$1" > /dev/stderr; exit 1; } 
    #dependency check 
    if ! hash openssl 2>/dev/null; then fail "openssl not installed"; fi 
    if ! hash curl 2>/dev/null; then fail "curl not installed"; fi 
    #params 
    path="${1}" 
    bucket=$(cut -d '/' -f 1 <<< "$path") 
    key=$(cut -d '/' -f 2- <<< "$path") 
    region="${2:-us-west-1}" 
    #load creds 
    access="$AWS_ACCESS_KEY" 
    secret="$AWS_SECRET_KEY" 
    #validate 
    if [[ "$bucket" = "" ]]; then fail "missing bucket (arg 1)"; fi; 
    if [[ "$key" = "" ]]; then fail "missing key (arg 1)"; fi; 
    if [[ "$region" = "" ]]; then fail "missing region (arg 2)"; fi; 
    if [[ "$access" = "" ]]; then fail "missing AWS_ACCESS_KEY (env var)"; fi; 
    if [[ "$secret" = "" ]]; then fail "missing AWS_SECRET_KEY (env var)"; fi; 
    #compute signature 
    contentType="text/html; charset=UTF-8" 
    date="`date -u +'%a, %d %b %Y %H:%M:%S GMT'`" 
    resource="/${bucket}/${key}" 
    string="GET\n\n${contentType}\n\nx-amz-date:${date}\n${resource}" 
    signature=`echo -en $string | openssl sha1 -hmac "${secret}" -binary | base64` 
    #get! 
    curl -H "x-amz-date: ${date}" \ 
     -H "Content-Type: ${contentType}" \ 
     -H "Authorization: AWS ${access}:${signature}" \ 
     "https://s3-${region}.amazonaws.com${resource}" 
} 

Tested trên OSX và Ubuntu. Đã lưu trong số Github gist này.

0

TS yêu cầu phiên bản SHA-1 hoạt động của tập lệnh. Tuy nhiên, SHA-1 đã lỗi thời và Amazon có các trung tâm dữ liệu chỉ chấp nhận mã hóa SHA-256, theo đó kịch bản tải xuống có thể được sử dụng cho tất cả các trung tâm dữ liệu S3: Nó cũng theo chuyển hướng HTTP 307.

#!/bin/sh 

#USAGE: 
# download-aws.sh <bucket> <region> <source-file> <dest-file> 

set -e 

s3Key=xxxxxxxxxxxxxxxxxxxx 
s3Secret=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 

file=$3 
bucket=$1 
host="${bucket}.s3.amazonaws.com" 
resource="/${file}" 
contentType="text/plain" 
dateValue="`date +'%Y%m%d'`" 
X_amz_date="`date +'%Y%m%dT%H%M%SZ'`" 
X_amz_algorithm="AWS4-HMAC-SHA256" 
awsRegion=$2 
awsService="s3" 
X_amz_credential="$s3Key%2F$dateValue%2F$awsRegion%2F$awsService%2Faws4_request" 
X_amz_credential_auth="$s3Key/$dateValue/$awsRegion/$awsService/aws4_request" 

signedHeaders="host;x-amz-algorithm;x-amz-content-sha256;x-amz-credential;x-amz-date" 
contentHash="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" 

HMAC_SHA256_asckey() { 
     var=`/bin/echo -en $2 | openssl sha256 -hmac $1 -binary | xxd -p -c256` 
     echo $var 
} 
HMAC_SHA256() { 
     var=`/bin/echo -en $2 | openssl dgst -sha256 -mac HMAC -macopt hexkey:$1 -binary | xxd -p -c256` 
     echo $var 
} 
REQUEST() { 
     canonicalRequest="GET\n$resource\n\n"\ 
"host:$1\n"\ 
"x-amz-algorithm:$X_amz_algorithm""\n"\ 
"x-amz-content-sha256:$contentHash""\n"\ 
"x-amz-credential:$X_amz_credential""\n"\ 
"x-amz-date:$X_amz_date""\n\n"\ 
"$signedHeaders\n"\ 
"$contentHash" 
     #echo $canonicalRequest 
     canonicalHash=`/bin/echo -en "$canonicalRequest" | openssl sha256 -binary | xxd -p -c256` 
     stringToSign="$X_amz_algorithm\n$X_amz_date\n$dateValue/$awsRegion/s3/aws4_request\n$canonicalHash" 
     #echo $stringToSign 


     s1=`HMAC_SHA256_asckey "AWS4""$s3Secret" $dateValue` 
     s2=`HMAC_SHA256 "$s1" "$awsRegion"` 
     s3=`HMAC_SHA256 "$s2" "$awsService"` 
     signingKey=`HMAC_SHA256 "$s3" "aws4_request"` 
     signature=`/bin/echo -en $stringToSign | openssl dgst -sha256 -mac HMAC -macopt hexkey:$signingKey -binary | xxd -p -c256` 
     #echo signature 

     authorization="$X_amz_algorithm Credential=$X_amz_credential_auth,SignedHeaders=$signedHeaders,Signature=$signature" 
     result=$(curl --silent -H "Host: $1" -H "X-Amz-Algorithm: $X_amz_algorithm" -H "X-Amz-Content-Sha256: $contentHash" -H "X-Amz-Credential: $X_amz_credential" -H "X-Amz-Date: $X_amz_date" -H "Authorization: $authorization" https://${1}/${file} -o "$2" --write-out "%{http_code}") 
     if [ $result -eq 307 ]; then 
       redirecthost=`cat $2 | sed -n 's:.*<Endpoint>\(.*\)</Endpoint>.*:\1:p'` 
       REQUEST "$redirecthost" "$2" 
     fi 
} 
REQUEST "$host" "$4" 

Thử nghiệm trên Ubuntu

Nếu ai đó biết một giải pháp để loại bỏ các bước HMAC-ASCII, bạn mong bạn trả lời. Tôi nhận được điều này chỉ làm việc theo cách này.

Các vấn đề liên quan