S3tools / S3cmd 邮件列表:
S3cmd 需要 Python 2.6 或更高版本。从 S3cmd 版本 2 开始,还支持 Python 3+。
请参阅安装说明。
S3cmd ( s3cmd
) 是一个免费的命令行工具和客户端,用于上传、检索和管理 Amazon S3 以及使用 S3 协议的其他云存储服务提供商(例如 Google Cloud Storage 或 DreamHost DreamObjects)中的数据。它最适合熟悉命令行程序的高级用户。它也是批处理脚本和自动备份到 S3(从 cron 等触发)的理想选择。
S3cmd是用Python编写的。它是一个根据 GNU 公共许可证 v2 (GPLv2) 提供的开源项目,并且免费供商业和私人使用。您只需向亚马逊支付使用其存储空间的费用。
自 2008 年首次发布以来,S3cmd 中添加了许多功能和选项......我们最近统计了超过 60 个命令行选项,包括分段上传、加密、增量备份、s3 同步、ACL 和元数据管理、S3存储桶大小、存储桶策略等等!
Amazon S3 提供一种可通过 Internet 访问的托管存储服务,任何人都可以存储任意数量的数据并在以后再次检索。
S3 是亚马逊运营的一项付费服务。在将任何内容存储到 S3 之前,您必须注册一个“AWS”帐户(其中 AWS = Amazon Web Services)以获得一对标识符:访问密钥和秘密密钥。您需要将这些密钥提供给 S3cmd。将它们视为您的 S3 帐户的用户名和密码。
截至撰写本文时,使用 S3 的成本为(以美元为单位):
每月使用的存储空间每 GB 0.023 USD
加
每 GB 0.00 美元 - 上传的所有数据
加
每 GB 0.000 美元 - 每月下载前 1GB 数据 每 GB 0.090 美元 - 每月最多下载 10 TB 数据 每 GB 0.085 美元 - 下载接下来 40 TB 数据 每 GB 0.070 美元 - 下载每月 100 TB 数据 每 GB 0.050 美元 - 下载数据/月超过 150 TB
加
每 1,000 个 PUT、COPY 或 LIST 请求 0.005 USD 每 10,000 个 GET 和所有其他请求 0.004 USD
例如,如果您在 1 月 1 日上传了在新西兰度假时拍摄的 2GB JPEG 照片,则在 1 月底,您将因使用每月 2GB 存储空间而被收取 0.05 美元的费用,上传 2GB 数据的费用为 0.0 美元,并收取 0.05 美元的费用。请求几美分。完整备份您珍贵的假日照片的费用略高于 0.06 美元。
二月你别碰它。您的数据仍在 S3 服务器上,因此您为这 2 GB 支付 0.06 美元,但任何传输都不会收取一分钱。备份的持续成本为 0.05 美元。还不错。
3 月份,您允许匿名读取您的一些图片,并且您的朋友下载了其中 1500MB 的图片。由于文件归您所有,因此您需要承担由此产生的费用。这意味着到 3 月底,您将需要支付 0.05 美元的存储费用以及 0.045 美元的朋友产生的下载流量费用。
没有最低每月合同或安装费。你所使用的就是你所支付的。一开始我的账单大约是 0.03 美元,甚至为零。
简而言之,这就是 Amazon S3 的定价模型。有关更多详细信息,请查看 Amazon S3 主页。
不用说,所有这些钱都是亚马逊自己收取的,使用 S3cmd 显然是不需要付费的:-)
存储在 S3 中的文件称为“对象”,其名称正式称为“密钥”。由于这有时会让用户感到困惑,因此我们经常将对象称为“文件”或“远程文件”。每个对象都属于一个“桶”。
为了描述 S3 存储中的对象,我们发明了一种类似 URI 的模式,其形式如下:
s3://BUCKET
或者
s3://BUCKET/OBJECT
存储桶有点像目录或文件夹,但有一些限制:
最好使用与 DNS 兼容的存储桶名称。例如,这意味着您不应使用大写字符。虽然 DNS 合规性并不是严格要求的,但下面描述的某些功能不适用于与 DNS 不兼容的命名存储桶。更进一步的是为存储桶使用完全限定域名 (FQDN) - 这具有更多好处。
请查找本文后面的“虚拟主机”,了解有关 FQDN 命名存储桶的更多详细信息。
与存储桶不同,对象名称几乎没有限制。这些可以是长度最多为 1024 字节的任何 UTF-8 字符串。有趣的是,对象名称可以包含正斜杠字符 (/),因此my/funny/picture.jpg
是有效的对象名称。请注意,没有名为my
和funny
的目录或存储桶 - 它实际上是一个名为my/funny/picture.jpg
的单个对象名称,并且 S3 根本不关心它看起来像目录结构。
例如,此类图像的完整 URI 可能是:
s3://my-bucket/my/funny/picture.jpg
存储在 S3 中的文件可以是私有的,也可以是公共的。私人文件只能由上传它们的用户读取,而公共文件则可以由任何人读取。此外,可以使用 HTTP 协议访问公共文件,而不仅仅是使用s3cmd
或类似工具。
文件的 ACL(访问控制列表)可以在上传时使用--acl-public
或--acl-private
选项以及s3cmd put
或s3cmd sync
命令进行设置(见下文)。
或者,可以使用s3cmd setacl --acl-public
(或--acl-private
)命令更改现有远程文件的 ACL。
转到 https://aws.amazon.com/s3,单击右栏中的“注册 Web 服务”按钮并完成注册。您必须提供您的信用卡详细信息,以便 Amazon 向您收取 S3 使用费。最后您应该拥有访问密钥和密钥。
如果您设置单独的 IAM 用户,则该用户的访问密钥必须至少具有以下权限才能执行任何操作:
其他示例策略可以在 https://docs.aws.amazon.com/AmazonS3/latest/dev/example-policies-s3.html 找到
s3cmd --configure
系统会要求您提供两个密钥 - 从确认电子邮件或亚马逊帐户页面复制并粘贴它们。复制时要小心!它们区分大小写,并且必须准确输入,否则您将不断收到有关无效签名或类似错误的错误。
请记住向密钥添加 s3:ListAllMyBuckets 权限,否则您在测试访问时将收到 AccessDenied 错误。
s3cmd ls
以列出所有存储桶。由于您刚刚开始使用 S3,目前您还没有拥有任何存储桶。所以输出将为空。
s3cmd mb s3://my-new-bucket-name
创建一个存储桶如上所述,存储桶名称在 S3 的所有用户中必须是唯一的。这意味着“test”或“asdf”等简单名称已被占用,您必须编写一些更新颖的名称。为了演示尽可能多的功能,让我们创建一个以 FQDN 命名的存储桶s3://public.s3tools.org
:
$ s3cmd mb s3://public.s3tools.org
Bucket 's3://public.s3tools.org' created
s3cmd ls
再次列出您的存储桶现在您应该看到新创建的存储桶:
$ s3cmd ls
2009-01-28 12:34 s3://public.s3tools.org
$ s3cmd ls s3://public.s3tools.org
$
确实是空的。
$ s3cmd put some-file.xml s3://public.s3tools.org/somefile.xml
some-file.xml -> s3://public.s3tools.org/somefile.xml [1 of 1]
123456 of 123456 100% in 2s 51.75 kB/s done
将两目录树上传到存储桶的虚拟“目录”中:
$ s3cmd put --recursive dir1 dir2 s3://public.s3tools.org/somewhere/
File 'dir1/file1-1.txt' stored as 's3://public.s3tools.org/somewhere/dir1/file1-1.txt' [1 of 5]
File 'dir1/file1-2.txt' stored as 's3://public.s3tools.org/somewhere/dir1/file1-2.txt' [2 of 5]
File 'dir1/file1-3.log' stored as 's3://public.s3tools.org/somewhere/dir1/file1-3.log' [3 of 5]
File 'dir2/file2-1.bin' stored as 's3://public.s3tools.org/somewhere/dir2/file2-1.bin' [4 of 5]
File 'dir2/file2-2.txt' stored as 's3://public.s3tools.org/somewhere/dir2/file2-2.txt' [5 of 5]
正如您所看到的,我们不必创建/somewhere
'目录'。事实上,它只是一个文件名前缀,而不是一个真正的目录,并且不需要事先以任何方式创建。
除了使用put
和--recursive
选项之外,您还可以使用sync
命令:
$ s3cmd sync dir1 dir2 s3://public.s3tools.org/somewhere/
$ s3cmd ls s3://public.s3tools.org
DIR s3://public.s3tools.org/somewhere/
2009-02-10 05:10 123456 s3://public.s3tools.org/somefile.xml
使用 --recursive (或 -r)列出所有远程文件:
$ s3cmd ls --recursive s3://public.s3tools.org
2009-02-10 05:10 123456 s3://public.s3tools.org/somefile.xml
2009-02-10 05:13 18 s3://public.s3tools.org/somewhere/dir1/file1-1.txt
2009-02-10 05:13 8 s3://public.s3tools.org/somewhere/dir1/file1-2.txt
2009-02-10 05:13 16 s3://public.s3tools.org/somewhere/dir1/file1-3.log
2009-02-10 05:13 11 s3://public.s3tools.org/somewhere/dir2/file2-1.bin
2009-02-10 05:13 8 s3://public.s3tools.org/somewhere/dir2/file2-2.txt
$ s3cmd get s3://public.s3tools.org/somefile.xml some-file-2.xml
s3://public.s3tools.org/somefile.xml -> some-file-2.xml [1 of 1]
123456 of 123456 100% in 3s 35.75 kB/s done
$ md5sum some-file.xml some-file-2.xml
39bcb6992e461b269b95b3bda303addf some-file.xml
39bcb6992e461b269b95b3bda303addf some-file-2.xml
原始文件的校验和与检索到的文件之一相匹配。看起来有效:-)
要从 S3 检索整个“目录树”,请使用递归 get:
$ s3cmd get --recursive s3://public.s3tools.org/somewhere
File s3://public.s3tools.org/somewhere/dir1/file1-1.txt saved as './somewhere/dir1/file1-1.txt'
File s3://public.s3tools.org/somewhere/dir1/file1-2.txt saved as './somewhere/dir1/file1-2.txt'
File s3://public.s3tools.org/somewhere/dir1/file1-3.log saved as './somewhere/dir1/file1-3.log'
File s3://public.s3tools.org/somewhere/dir2/file2-1.bin saved as './somewhere/dir2/file2-1.bin'
File s3://public.s3tools.org/somewhere/dir2/file2-2.txt saved as './somewhere/dir2/file2-2.txt'
由于未指定目标目录, s3cmd
将目录结构保存在当前工作目录(“.”)中。
两者之间有一个重要的区别:
get s3://public.s3tools.org/somewhere
和
get s3://public.s3tools.org/somewhere/
(注意末尾的斜杠)
s3cmd
始终使用最后一个路径部分,即最后一个斜杠之后的单词来命名文件。
在s3://.../somewhere
的情况下,最后一个路径部分是“somewhere”,因此递归 get 将本地文件命名为“somewhere/dir1”、“somewhere/dir2”等。
另一方面,在s3://.../somewhere/
中,最后一个路径部分是空的,s3cmd 将仅创建没有 'somewhere/' 前缀的 'dir1' 和 'dir2':
$ s3cmd get --recursive s3://public.s3tools.org/somewhere/ ~/
File s3://public.s3tools.org/somewhere/dir1/file1-1.txt saved as '~/dir1/file1-1.txt'
File s3://public.s3tools.org/somewhere/dir1/file1-2.txt saved as '~/dir1/file1-2.txt'
File s3://public.s3tools.org/somewhere/dir1/file1-3.log saved as '~/dir1/file1-3.log'
File s3://public.s3tools.org/somewhere/dir2/file2-1.bin saved as '~/dir2/file2-1.bin'
看?它是~/dir1
而不是上一个示例中的~/somewhere/dir1
。
删除 s3://public.s3tools.org/somewhere/ 下的所有内容
$ s3cmd del --recursive s3://public.s3tools.org/somewhere/
File s3://public.s3tools.org/somewhere/dir1/file1-1.txt deleted
File s3://public.s3tools.org/somewhere/dir1/file1-2.txt deleted
...
现在尝试删除存储桶:
$ s3cmd rb s3://public.s3tools.org
ERROR: S3 error: 409 (BucketNotEmpty): The bucket you tried to delete is not empty
哎呀,我们忘记了s3://public.s3tools.org/somefile.xml
。无论如何,我们可以强制删除存储桶:
$ s3cmd rb --force s3://public.s3tools.org/
WARNING: Bucket is not empty. Removing all the objects from it first. This may take some time...
File s3://public.s3tools.org/somefile.xml deleted
Bucket 's3://public.s3tools.org/' removed
基本用法如上一节所述简单。
您可以使用-v
选项增加详细程度,如果您真的很想知道程序在其引擎盖下做什么,请使用-d
运行它以查看所有“调试”输出。
使用--configure
配置后,所有可用选项都会写入~/.s3cfg
文件中。它是一个文本文件,可以在您最喜欢的文本编辑器中进行修改。
即使对象失败,传输命令(put、get、cp、mv 和sync)也会继续传输。如果发生故障,则会将故障输出到 stderr,并且退出状态将为 EX_PARTIAL (2)。如果指定了选项--stop-on-error
,或者配置选项 stop_on_error 为 true,则传输停止并返回适当的错误代码。
有关更多信息,请参阅 S3cmd / S3tools 主页。
版权所有 (C) 2007-2023 TGRMN Software (https://www.tgrmn.com)、Sodria SAS (https://www.sodria.com/) 和贡献者
该程序是免费软件;您可以根据自由软件基金会发布的 GNU 通用公共许可证的条款重新分发和/或修改它;许可证的版本 2,或(由您选择)任何更高版本。
分发此程序的目的是希望它有用,但不提供任何保证;甚至没有适销性或特定用途适用性的默示保证。有关更多详细信息,请参阅 GNU 通用公共许可证。