Download private file from S3 using bash

后端 未结 5 1135
不知归路
不知归路 2020-12-16 16:31

I am trying to get the following bash script to work (copied from http://curl.haxx.se/mail/archive-2014-10/0006.html#replies):

#!/bin/sh 
file=path/to/file          


        
5条回答
  •  别那么骄傲
    2020-12-16 16:40

    Using various answers in this thread, I converted it into a handy s3get bash function:

    #!/bin/bash
    
    #usage - s3get writes the specified object to stdout
    #  s3get  [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 on OSX and Ubuntu. Saved in this Github gist.

提交回复
热议问题