使用 wget 或 curl 下载具有共享访问签名的 Azure Blob

Download Azure Blob with Shared Access Signature using wget or curl

我知道我可以使用 Azure CLI 来完成此操作,但我想使用常见的 Linux/Unix 命令。

我有一个私有的 Azure Blob 容器。我们称它为 https://my-account.blob.core.windows.net/my-blob-container/my-file.my-extension

如果我的容器设置为 "Public read access for blobs only",一切正常。

$ wget https://my-account.blob.core.windows.net/my-blob-container/my-file.my-extension
--2016-04-28 16:11:15-- https://my-account.blob.core.windows.net/my-blob-container/my-file.my-extension
Resolving my-account.blob.core.windows.net (my-account.blob.core.windows.net)... 4.11.2.14
Connecting to my-account.blob.core.windows.net (my-account.blob.core.windows.net)|4.11.2.14|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 21682 (21K) [application/octet-stream]
Saving to: ‘my-file.my-extension’

如果我的容器设置为 "No public access",并且我创建了一个名为 my-policy 的访问策略,Read/Write/Delete/List 一年,我直接得到以下 link : https://my-account.blob.core.windows.net/my-blob-container/my-file.my-extension?sv=2015-02-21&si=my-policy&sr=b&sig=y%2B2pvIuR9rGQdvm%2FQKp0xNCWE%2B1G%2F2IqjHkWMhRcPUA%3D

如果我将 link 复制到浏览器中,文件会自动下载。如果我使用 wget,我会收到 404 错误:

$ wget https://my-account.blob.core.windows.net/my-blob-container/my-file.my-extension?sv=2015-02-21&si=my-policy&sr=b&sig=y%2B2pvIuR9rGQdvm%2FQKp0xNCWE%2B1G%2F2IqjHkWMhRcPUA%3D
[4] 14106
[5] 14107
[6] 14108
[2]   Done                    si=my-policy
[3]   Done                    sr=b
$ --2016-04-29 01:25:54--  https://my-account.blob.core.windows.net/my-blob-container/my-file.my-extension?sv=2015-02-21
Resolving my-account.blob.core.windows.net (my-account.blob.core.windows.net)... 4.11.2.14
Connecting to my-account.blob.core.windows.net (my-account.blob.core.windows.net)|4.11.2.14|:443... connected.
HTTP request sent, awaiting response... 404 The specified resource does not exist.
2016-04-29 01:25:54 ERROR 404: The specified resource does not exist..

wget returns 退出统计 8 ("Server issued an error response")。

如果没有细节,查询很难调试,但是...

由于某些 URL 编码 的性质,您必须确保在进行 wget 调用时 URL 包含在语音标记中(如果你做 curl 也是一样)

我可以在容器级别创建一个 SAS,允许我读取存储中的文件

wget "https://azurerpkg.blob.core.windows.net/azurer/doggies.jpg?st=2016-06-06T07%3A56%3A00Z&se=2018-06-07T07%3A56%3A00Z&sp=rl&sv=2015-04-05&sr=c&sig=nKQz5BcWoUaASBzSW7Hv0TzfMbTFcf0f%2B5mMtmTwQ2A%3D" -k -O "doggies.jpg"

如果我在 blob 级别创建特定的 SAS,我的 wget 也可以工作

wget "https://azurerpkg.blob.core.windows.net/azurer/doggies.jpg?st=2016-06-06T07%3A56%3A00Z&se=2018-06-07T07%3A56%3A00Z&sp=rl&sv=2015-04-05&sr=b&sig=ntNFXS6fUlHVkiqoqj2rHg1Pw6gSNosnYqj3CQ6GIrg%3D" -k -O doggies.jpg

有效的共享访问签名查询字符串需要以下参数的参数:

  • st
  • se
  • sp
  • sr
  • 签名

你的似乎缺少 se 组件,即到期日。