Amazon AWS S3通过Wget签名URL

mg0*_*g03 10 signed amazon-s3

我可以在我的帐户中为存储桶创建一个Amazon S3签名URL,我可以通过Amazon AWS CLI下载并上传该存储桶.

我创建了Amazon S3 URL,如下所示:

from boto.s3.connection import S3Connection
key = os.environ['aws_access_key_id']
secret = os.environ['aws_secret_access_key']
c = S3Connection(key,secret,is_secure=False)
bucket = c.get_bucket('my-bucket')
bktkey = bucket.get_key('stuff.tar.gz')
seconds=60*60*12
url2 = bktkey.generate_url(expires_in=seconds)
print '%s' %url2
Run Code Online (Sandbox Code Playgroud)

url2在Chrome中使用并复制粘贴它,我下载了stuff.tar.gz.

但是当我像这样使用Wget时

wget <whatever is in url2>
Run Code Online (Sandbox Code Playgroud)

我得到以下异常,

HTTP request sent, awaiting response... 403 Forbidden
2015-12-04 20:48:57 ERROR 403: Forbidden.
Run Code Online (Sandbox Code Playgroud)

为什么Wget在Chrome和Firefox使用签名的Amazon S3 URL成功下载的地方失败了?

use*_*536 22

我遇到过同样的问题.修复是使用引号:

wget -O test.tar.gz "https://bucket.s3.amazonaws.com/app1/10/10.2/test.tar.gz?Signature=hgbdhjJHGK&Expires=1454446963&AWSAccessKeyId=AAAAAAAAA"
Run Code Online (Sandbox Code Playgroud)

  • 问题是 URL 中的某些字符在 shell 中具有特殊含义,这就是它在 shell 中失败但在 bash 中失败的原因。例如,'&amp;' 拖尾 bash 以将命令置于后台。所以 bash 只会在截断 URL 之前解析它。在 URL 周围添加引号会导致 bash 将 URL 视为字符串而不是 bash 命令行参数。 (2认同)