如何使用wget从S3存储桶下载文件?

47

使用S3cmd工具和命令s3cmd put contentfile S3://test_bucket/test_file,我可以通过我的凭据将一些内容推送到S3存储桶中。

在其他没有安装s3cmd的计算机上,我需要从该存储桶下载内容,但它们已经安装了wget。

当我尝试使用wget从我的存储桶下载一些内容时,我得到以下错误信息:

 https://s3.amazonaws.com/test_bucket/test_file
--2013-08-14 18:17:40--  `https`://s3.amazonaws.com/test_bucket/test_file
Resolving s3.amazonaws.com (s3.amazonaws.com)... [ip_here]
Connecting to s3.amazonaws.com (s3.amazonaws.com)|ip_here|:port... connected.
HTTP request sent, awaiting response... 403 Forbidden
`2013`-08-14 18:17:40 ERROR 403: Forbidden.

我已经通过亚马逊AWS Web控制台手动将这个存储桶设置为公开。

如何使用wget从S3存储桶中下载内容到本地txt文件?


提示其他人,我必须将我的S3 URL用引号括起来才能使其正常工作。否则,我会得到403 Forbidden的错误。例如:wget "https://s3.amazonaws.com/test_bucket/test_file"。我们的URL正在过期,并且其中有一些诡计来进行身份验证。 - Joshua Pinter
12个回答

40
您应该可以通过以下方式创建的URL来访问它: http://{bucket-name}.s3.amazonaws.com/<path-to-file> 现在,假设您的S3文件路径为: s3://test-bucket/test-folder/test-file.txt 您应该能够使用以下URL获取此文件: http://test-bucket.s3.amazonaws.com/test-folder/test-file.txt

请注意,您正在使用HTTP协议,而我从Amazon管理控制台获得的是HTTPS网址... HTTPS会如何改变事情? - David

39
  1. 进入S3控制台

  2. 选择您的对象

  3. 点击“对象操作”

  4. 选择“下载为”

  5. 使用鼠标右键“复制链接地址”

  6. 然后使用以下命令:

    wget --no-check-certificate --no-proxy 'http://your_bucket.s3.amazonaws.com/your-copied-link-address.jpg'


1
非常好用!无需安装s3cmd或其他CLI :) - max kaplan
2
HTTP请求已发送,等待响应... 403禁止访问。 - JimmyTheCode

9

AWS命令行界面提供了“presign”命令,可以用来获取私有S3资源的临时公共URL。

aws s3 presign s3://private_resource

您可以使用wget并通过预签名URL下载资源。

7
错误403:禁止访问。 - user2568374
它运行得非常好!!!它给了我一个HTTP路径,我可以在wget中使用它来恢复文件的下载。谢谢!!! - Anton Danilchenko
上次我尝试使用它也遇到了禁止错误。不过我发现了一种更好的方法,可以使用 aws s3 cp 命令来完成这个操作,就像我在我的答案中所描述的那样(请参见上面或下面)。 - Anton Danilchenko

8

明白了...如果你在S3桶中使用S3CMD上传文件并带有 --acl public 标志,则可以轻松地从S3中使用wget下载该文件...

结论:为了使用wget进行下载,必须首先使用以下命令将内容上传到S3:s3cmd put --acl public --guess-mime-type <test_file> s3://test_bucket/test_file

或者你可以尝试:

s3cmd setacl --acl-public --guess-mime-type s3://test_bucket/test_file

请注意上面的setacl标志。这将使S3中的文件公开访问,然后您可以执行wget http://s3.amazonaws.com/test_bucket/test_file。

7

我曾有过几次相同的情况。使用CLI下载AWS上的任何文件的最快、最简单的方法如下命令:

aws s3 cp s3://bucket/dump.zip dump.zip

文件下载速度比使用wget快得多,至少如果您在美国之外的地方。


使用我的 AWS CLI 凭证 激活后,这对我来说完美地运行了。 - Andreas L.
只有在配置了 AWS CLI 的情况下,此项工作才能正常运行。否则它是无法工作的。 - Vijaysinh Parmar
文件保存在哪里?我成功运行了命令,但是找不到文件。 - S.EB

1

我曾经遇到同样的错误,通过添加安全组入站规则解决了它:

在我的实例所在的子网中,将端口443的HTTPS类型添加到我的IP地址上(因为只有我一个人访问它)。

希望这能帮助那些忘记包含此内容的人。


1

最简单的方法是首先禁用阻止所有公共访问

点击您的存储桶名称 >> 进入权限 >> 阻止公共访问 (存储桶设置) enter image description here 如果它打开 >> 点击编辑 >> 取消选中该框,然后单击保存更改 enter image description here 现在点击对象名称 >> 对象操作 >> 使用 ACL 公开,然后确认公开 enter image description here 之后,复制对象 URL,然后继续下载 enter image description here

希望这能帮助未来的提问者。干杯!


0

我知道我来晚了,但是想要补充一些在这里没有被提到的内容。

如果你正在为wget创建一个预签名的s3 URL,请确保你正在运行aws cli v2。 我遇到了同样的问题,并意识到s3有这个问题。

Requests specifying Server Side Encryption with AWS KMS managed keys require AWS Signature Version 4

这个问题在你在AWS CLI V2上预签名后就会解决。

0

如果您无法在Linux机器上安装aws客户端,请尝试以下方法。

  • 转到存储桶,然后单击“下载”按钮。复制生成的链接。
  • 执行以下命令

    wget --no-check-certificate --no-proxy --user=username --ask-password -O "下载链接"

谢谢


0

我犯了同样的错误

我做了以下几步:

  1. 创建了IAM角色 > AWS服务类型 > AmazonS3FullAccess策略
  2. 将此角色应用于EC2实例
  3. 在安全组中打开入站HTTP和HTTPS以允许IPv4任何地方连接
  4. 将S3存储桶设置为公共
  5. 成功!wget工作正常!✅

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接