本文主要记录的是两个 S3
服务的命令行工具,也就是 s3cmd 和 s5cmd;
主要解决的需求就是使用这两个工具,自动同步 S3
服务上的文件到本地;具体场景如下:
个人博客网站(blog.jiumoz.top)所有的图片都是存储在 Cloudflare R2 上的,因为它有不少的免费额度,包括存储、流量、访问次数等;我写博客的是使用的 Typora+Piclist
,然后上传到博客后台。肯定是速度有一定的缺陷,但是考虑成本和流量,所以先将就一下吧,而且它并没有很慢。
但是还有一个致命的问题,那就是上传 CSDN 的时候,CSDN 并不能转存 CloudFlare R2 的图片,这让我很难受,在网上找了很多办法,都没用;后来我把图片放到自己服务器上,新建一个静态网站,然后再把图片链接替换后,上传 CSDN 完全没问题,转存基本没有失败的,所以我就想把图片都在服务器上放一份,然后上传 CSDN 的时候,把 R2 的链接全部换成服务器上的链接再上传就没问题了;
紧接着就有几个问题:
Ctrl+H
就可以了;
解决这两个问题,那就都好说了;
如果你没有这样的需求,我也推荐你往下看一看,因为本文要介绍的这些工具并不简单,不管是上传、下载、备份等都能通过这些工具实现,详细内容往下看吧!
其实能看这篇文章,大概率是对对象存储以及 S3
协议有所了解的,所以这里就简单介绍一下,不深入;
对象存储是一种为存储大量非结构化数据设计的技术,适合存放图片、视频、文档、备份文件等大文件。和传统的文件存储不同,对象存储将数据视为“对象”,每个对象都有一个唯一的标识符和一组元数据(描述信息),因此无需复杂的文件路径管理。对象存储的特点是可扩展性强,适合海量数据存储需求,广泛应用于云服务中。
S3协议是由 Amazon 设计的一种标准化接口,用于访问和管理存储在云中的对象。S3
协议定义了如何存储、读取、删除对象,并控制访问权限。许多对象存储服务都支持 S3
协议,意味着用户可以用相同的API或客户端工具来访问不同的存储服务(比如AWS S3、MinIO等)。现在主流的对象存储服务,基本都支持 S3
协议,所以日常需要接触对象存储的话就了解 S3
是有必要的;
GitHub 地址:https://github.com/s3tools/s3cmd
s3cmd
是一个用于管理 Amazon S3
和兼容 S3
协议存储(如 DigitalOcean Spaces、Alibaba OSS)的开源命令行工具。它支持文件的上传、下载、同步、权限管理、版本控制和数据加密,适合需要频繁进行文件管理的开发者。相比 AWS CLI
,s3cmd
更简洁、灵活,非常适合小型开发团队和个人用户。
在 Linux 和 Mac OS X 上,可以使用包管理器来安装s3cmd
。以下是在不同系统上的安装方法:
Ubuntu/Debian:
sudo apt-get install s3cmd
Fedora/CentOS/RHEL:
sudo yum install s3cmd
Mac OS X(使用 Homebrew):
brew install s3cmd
在 Windows 上,可以通过 Cygwin 来安装s3cmd
。以下是安装步骤:
s3cmd
包。安装完成后,可以在命令提示符或终端中输入s3cmd --version
来验证安装是否成功。
在使用s3cmd
之前,需要进行一些配置。以下是配置步骤:
s3cmd --configure
命令。这将启动一个配置向导,询问你一些关于 S3 存储的信息。配置完成后,s3cmd
将把配置信息保存在~/.s3cfg
文件中。
你可以编辑这个文件来更改配置,或者使用s3cmd --configure
命令重新运行配置向导。
这里用连接七牛云来举例,下面是使用命令行工具配置的详细记录,当前 s3cmd
的版本是 2.2.0
,一行提示都没删:
root@ser459952566906:~# s3cmd --configure # 启动 s3cmd 配置过程,设置用于连接 S3 的参数
Enter new values or accept defaults in brackets with Enter.
Refer to user manual for detailed description of all options.
# 提示输入新值或按回车接受括号中的默认值,参考用户手册以了解每个选项的详细说明
Access key and Secret key are your identifiers for Amazon S3. Leave them empty for using the env variables.
# Access Key 和 Secret Key 是连接 Amazon S3 的唯一标识符。也可以留空并使用环境变量中已有的密钥
Access Key: gZFv***************ly_iAk
# 输入 Access Key,类似用户名的身份认证标识符
Secret Key: 3XHC***************6CJS9Mul
# 输入 Secret Key,类似密码的身份认证标识符
Default Region [US]: cn-south-1
# 输入默认区域(Region),如果服务位于特定区域,选择该区域以优化访问速度,此处选择“cn-south-1”(查看你的s3服务的信息)
Use "s3.amazonaws.com" for S3 Endpoint and not modify it to the target Amazon S3.
# 建议将 S3 Endpoint 设置为 “s3.amazonaws.com”,以便连接到 Amazon S3;若是其他兼容服务,则可指定不同的端点
S3 Endpoint [s3.amazonaws.com]: s3.cn-south-1.qiniucs.com
# 设置 S3 Endpoint,即目标服务的 API 地址;此处是七牛云的 S3 兼容端点
Use "%(bucket)s.s3.amazonaws.com" to the target Amazon S3. "%(bucket)s" and "%(location)s" vars can be used
if the target S3 system supports dns based buckets.
# 若目标 S3 系统支持基于 DNS 的桶访问方式,推荐使用 "%(bucket)s.s3.amazonaws.com";其中 "%(bucket)s" 表示桶名占位符
DNS-style bucket+hostname:port template for accessing a bucket [%(bucket)s.s3.amazonaws.com]: %(bucket)s.s3.cn-south-1.qiniucs.com
# 设置 DNS 样式的桶访问模板,指定每个桶的 DNS 结构;使用兼容端点配置,例如“%(bucket)s.s3.cn-south-1.qiniucs.com”
Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
# 可选:设置加密密码,在传输到 S3 时保护文件免受未授权人员读取
Encryption password:
# 输入加密密码(留空则不启用传输加密)
Path to GPG program [/usr/bin/gpg]:
# 设置 GPG 程序路径,GPG 用于加密传输数据,默认为“/usr/bin/gpg”
When using secure HTTPS protocol all communication with Amazon S3
servers is protected from 3rd party eavesdropping. This method is
slower than plain HTTP, and can only be proxied with Python 2.7 or newer
# 选择 HTTPS 协议可以保护与 S3 服务器的通信免受第三方监听,但可能比 HTTP 慢
Use HTTPS protocol [Yes]: yes
# 是否使用 HTTPS 协议,选择“yes”启用 HTTPS 以提高安全性
On some networks all internet access must go through a HTTP proxy.
Try setting it here if you can't connect to S3 directly
# 若网络要求所有访问通过 HTTP 代理服务器,可在此设置代理,以便连接 S3
HTTP Proxy server name:
# 输入 HTTP 代理服务器名称(留空则不使用代理)
New settings:
Access Key: gZFv***************_iAk
Secret Key: 3XHC***************JS9Mul
Default Region: cn-south-1
S3 Endpoint: s3.cn-south-1.qiniucs.com
DNS-style bucket+hostname:port template for accessing a bucket: %(bucket)s.s3.cn-south-1.qiniucs.com
Encryption password:
Path to GPG program: /usr/bin/gpg
Use HTTPS protocol: True
HTTP Proxy server name:
HTTP Proxy server port: 0
# 显示新配置内容,包括密钥、区域、端点、桶访问模板、加密密码、GPG 程序路径、是否启用 HTTPS 和代理服务器信息
Test access with supplied credentials? [Y/n] y
# 测试是否可以使用配置的密钥访问存储服务,选择“y”以验证
Please wait, attempting to list all buckets...
# 提示稍候,正在尝试列出所有桶以验证访问权限
Success. Your access key and secret key worked fine :-)
# 若测试成功,将显示访问密钥验证成功的提示
Now verifying that encryption works...
# 接下来验证加密功能
Not configured. Never mind.
# 如果未配置加密功能,会提示忽略该项
Save settings? [y/N] y
# 保存配置文件以便后续操作,选择“y”确认保存
Configuration saved to '/root/.s3cfg'
# 配置已保存到 “/root/.s3cfg” 文件,用于后续 s3cmd 命令自动读取
如上就完成了配置;
如果你先命令行配置麻烦,你可以直接根目录创建一个 .s3cfg
文件;
nano ~/.s3cfg
然后复制下面信息进去并替换为你的 S3
服务的信息,下面这是配置 Cloudflare R2 的样例[1]:
[default]
access_key = <your-access-key-id>
secret_key = <your-secret-access-key>
bucket_location = auto
host_base = <account-id>.r2.cloudflarestorage.com
host_bucket = <account-id>.r2.cloudflarestorage.com
enable_multipart = False
account-id
很多地方都能获取:
如果是 R2
,令牌创建的时候也要注意,权限不对的话,会报错:
我配置的如下:
详细内容参考官网问答:https://s3tools.org/usage
查看桶:
s3cmd ls
查看桶里文件:
s3cmd ls s3://my-bucket
创建 Bucket:
s3cmd mb s3://my-bucket
上传文件:
s3cmd put localfile.txt s3://my-bucket
下载文件:
s3cmd get s3://my-bucket/yourfile.txt
删除文件:
s3cmd del s3://my-bucket/yourfile.txt
以下是 s3cmd 的进阶用法,详细讲解如何进行本地同步、权限管理、自动化备份等操作。
1. 双向同步:同步到 S3 和从 S3 同步到本地
s3cmd
不仅可以将本地文件夹同步到 S3,还可以将 S3 内容同步到本地。
本地文件夹同步到 S3:
s3cmd sync /local-folder/ s3://my-bucket
从 S3 同步到本地:
s3cmd sync s3://my-bucket /local-folder/
使用 --delete-removed
参数确保同步过程中删除本地不需要的文件:
s3cmd sync s3://my-bucket /local-folder/ --delete-removed
2. 设置文件和 Bucket 的权限
s3cmd
允许我们为文件和 Bucket 设置权限,通过 setacl
命令可以实现控制:
设置文件为公开访问:
s3cmd setacl s3://my-bucket/myfile.txt --acl-public
设置文件为私有:
s3cmd setacl s3://my-bucket/myfile.txt --acl-private
3. 使用 cron
实现自动化备份
s3cmd
支持与 cron
作业结合,便于自动化管理 S3 文件,例如定时同步本地文件夹到 S3,实现自动备份。
设置方法:
打开 cron
编辑器:
crontab -e
在 cron
编辑器中添加以下作业,将 /local-folder/
文件夹同步到 s3://my-bucket
,每天凌晨 2 点执行:
0 2 * * * s3cmd sync /local-folder/ s3://my-bucket --delete-removed
时间格式
0 2 \* \* \*
:这是cron
的时间格式,表示任务每天凌晨 2 点运行一次。每个字段的含义为:
0
:分钟,表示 0 分钟,即整点。2
:小时,表示凌晨 2 点。* * *
:依次表示日、月、星期,这里使用 *
表示任何值,即每天、每月、每周都执行。 s3cmd sync /local-folder/ s3://my-bucket --delete-removed
:这是 s3cmd
的同步命令。
sync
:s3cmd
的同步命令,用于将本地文件夹与 S3 存储桶内容保持一致。/local-folder/
:本地源文件夹路径。将该文件夹的内容同步到 S3。s3://my-bucket
:S3 目标路径,表示目标存储桶 my-bucket
。--delete-removed
:启用此选项后,如果本地文件夹中删除了文件,这些删除也会同步到 S3(即从 S3 中删除对应文件),确保 S3 存储的内容与本地一致。保存并退出。此时 cron
会按照设定时间自动执行备份任务。
如果你用了 1Panel
的话,可以使用计划任务很好的解决这个问题:
4. 数据加密
s3cmd
可以加密文件后再上传到 S3,确保数据安全。使用 --encrypt
选项可自动加密:
s3cmd put --encrypt localfile.txt s3://my-bucket
若要从 S3 下载加密的文件,s3cmd 会自动解密文件,但需要在配置中设置密钥。
5. 文件版本控制
如果 S3 Bucket 启用了版本控制,s3cmd 支持查看文件的不同版本。
列出文件的所有版本:
s3cmd ls --versions s3://my-bucket/myfile.txt
删除特定版本:
s3cmd del s3://my-bucket/myfile.txt --version-id VERSION_ID
6. 分段上传大文件
对于大文件,s3cmd 支持分段上传,通过 --multipart-chunk-size-mb
设置分段大小:
s3cmd put --multipart-chunk-size-mb=100 largefile.zip s3://my-bucket
7. 批量操作
支持使用通配符批量上传或删除文件。例如,上传当前文件夹下所有 .txt
文件:
s3cmd put *.txt s3://my-bucket
GitHub 地址:https://github.com/peak/s5cmd
s5cmd
是一个针对 Amazon S3
和类似对象存储服务设计的超快速命令行工具,支持批量文件操作和通配符管理功能,能够极大地优化和简化大量文件的对象存储操作流程。与其他常见工具(如 aws-cli
和 s3cmd
)相比,s5cmd 的速度优势尤为突出,特别是在处理大规模文件上传和下载时更显得高效。
s3cmd
快 32 倍,比 aws-cli
快 12 倍。s3cmd
和 aws-cli
分别只能达到 85 MB/s 和 375 MB/s。s5cmd 提供了跨平台支持,可在多种操作系统中安装,以下是 Linux 安装步骤,其他系统的安装请查阅官方文档:
首先,需要下载适用于 Linux 的 s5cmd
二进制文件,下载地址为https://github.com/peak/s5cmd/releases,它提供了很多版本,你不知道怎么选的话选下看:
tar.gz
文件是压缩的安装包,适合需要手动解压和安装的用户:
s5cmd_2.2.2_Linux-32bit.tar.gz
s5cmd_2.2.2_Linux-64bit.tar.gz
s5cmd_2.2.2_Linux-arm64.tar.gz
s5cmd_2.2.2_Linux-armv6.tar.gz
s5cmd_2.2.2_Linux-ppc64le.tar.gz
如果你使用的是基于 Debian 的 Linux 发行版(如 Ubuntu、Debian、Linux Mint 等),你可以使用 .deb
文件直接通过包管理器安装:
s5cmd_2.2.2_linux_386.deb
s5cmd_2.2.2_linux_amd64.deb
s5cmd_2.2.2_linux_arm64.deb
s5cmd_2.2.2_linux_armv6.deb
s5cmd_2.2.2_linux_ppc64le.deb
对于 Linux 系统,你可以通过以下命令来检查系统架构:
uname -m
x86_64
,则说明你使用的是 64 位系统。i686
或 i386
,则说明你使用的是 32 位系统。aarch64
,则说明你使用的是 64 位 ARM 系统。armv6
或类似标识,则是 ARMv6 架构。例如:
我就需要选择:s5cmd_2.2.2_Linux-64bit.tar.gz
安装包下载的方式很多,你可以下载到本地上传,也可以直接运行下面的命令(文件地址你需要在https://github.com/peak/s5cmd/releases里面复制):
wget https://github.com/peak/s5cmd/releases/download/v2.2.2/s5cmd_2.2.2_Linux-64bit.tar.gz
下载后,解压文件:
tar -xvzf xxxxxxx.tar.gz
为了在任何地方使用 s5cmd
,将其移动到 /usr/local/bin
目录:
sudo mv s5cmd /usr/local/bin/
运行以下命令查看 s5cmd
版本,确保安装成功:
s5cmd version
和 s3cmd
类似,需要配置一下连接信息,但是它没 s3cmd
那么方便;
使用AWS CLI 配置凭证
如果没有安装 AWS CLI,可以先安装它。使用以下命令在不同操作系统上安装 AWS CLI:
brew install awscli
或下载并安装官方版本。配置 AWS 凭证: aws configure 系统会提示输入 Access Key ID、Secret Access Key、默认区域和输出格式。根据实际情况填写。
使用环境变量配置
通过设置环境变量配置的话,运行下面的命令配置环境变量即可: export AWS_ACCESS_KEY_ID=your_access_key_id export AWS_SECRET_ACCESS_KEY=your_secret_access_key export AWS_DEFAULT_REGION=auto 然后,注意连接的时候需要使用
--endpoint-url
参数允指定自定义的 S3 端点 URL: 例如:s5cmd --endpoint-url https://<account-id>.r2.cloudflarestorage.com ls
mkdir -p ~/.aws 接下来,使用文本编辑器(如
nano
)打开或创建~/.aws/credentials
文件: nano ~/.aws/credentials 在credentials
文件中,可以按以下格式添加凭证: [default] aws_access_key_id = YOUR_ACCESS_KEY_ID aws_secret_access_key = YOUR_SECRET_ACCESS_KEY [profile_name] aws_access_key_id = YOUR_ACCESS_KEY_ID aws_secret_access_key = YOUR_SECRET_ACCESS_KEY
[default]
是默认配置文件的名称,如果你没有指定 profile,AWS CLI 会使用它。
[profile_name]
是你为特定配置创建的命名配置文件,替换 profile_name
为你自己定义的名称。
在 nano
中,按 Ctrl + O
保存文件,然后按 Enter
确认保存。接着按 Ctrl + X
退出编辑器。
然后同样的方法,在 ~/.aws/config
文件中,为配置文件指定 S3 兼容服务的端点:
[default] region = us-east-1
配置文件怎么写:配置 AWS CLI
这里还有个知识点,上面的 credentials
中不是配置了两个信息嘛,代表你可以设置多个连接信息,怎么切换呢?直接在命令行中使用 --profile
指定即可;例如:s5cmd --profile profile_name --endpoint-url https://<your-endpoint>.r2.cloudflarestorage.com ls
s5cmd
命令行参数传递凭证s5cmd --access-key “your_access_key_id” --secret-key “your_secret_access_key” --region auto --endpoint-url https://xxx.r2.cloudflarestorage.com ls s3://your-bucket-name/
详细信息参考:https://github.com/peak/s5cmd/blob/master/README.md
s5cmd ls
命令用于列出指定 S3 存储桶中的内容。可以按需列出不同层级的文件对象。
s5cmd ls s3://mybucket/
使用通配符,还可以列出特定前缀或文件类型的对象:
s5cmd ls s3://mybucket/logs/*.txt
上传文件到 S3:
s5cmd cp myfile.txt s3://mybucket/
下载文件到本地:
s5cmd cp s3://mybucket/myfile.txt ./
删除单个文件:
s5cmd rm s3://mybucket/myfile.txt
批量删除特定前缀的文件(例如删除所有 .log
文件):
s5cmd rm s3://mybucket/logs/*.log
s5cmd stat
命令可用于查看指定文件的元数据,包括文件大小、创建时间等。
s5cmd stat s3://mybucket/myfile.txt
s5cmd 支持在同一存储桶内或不同存储桶之间复制文件。
在同一存储桶内复制:
s5cmd cp s3://mybucket/myfile.txt s3://mybucket/mycopy.txt
在不同存储桶之间复制:
s5cmd cp s3://source-bucket/myfile.txt s3://destination-bucket/myfile.txt
利用通配符,s5cmd 可以一次性处理多个文件或文件夹。
批量上传:
s5cmd cp localdir/*.txt s3://mybucket/
批量下载:
s5cmd cp s3://mybucket/data/* ./localdir/
s5cmd sync
命令可以实现本地目录与 S3 之间的单向或双向同步。
单向同步(本地到 S3):
s5cmd sync ./localdir/ s3://mybucket/
单向同步(S3 到本地):
s5cmd sync s3://mybucket/ ./localdir/
s5cmd 支持通过调整并发参数加快传输速度,尤其在大文件或大量文件传输时表现更佳。
s5cmd cp -c 10 localdir/*.txt s3://mybucket/
其中 -c 10
表示设置并发数为 10。
通过指定重试次数与超时,可以提高传输的稳定性,避免长时间卡顿或因网络问题中断传输。
s5cmd cp --retry 3 --timeout 60s localfile.txt s3://mybucket/
s5cmd 支持文件夹的移动,可在同一区域或不同区域间完成:
s5cmd mv s3://source-bucket/folder s3://destination-bucket/folder
可以直接将压缩文件上传至 S3,或下载后自动解压:
s5cmd cp myfile.zip s3://mybucket/
# 或从 S3 下载并解压
s5cmd cp s3://mybucket/myfile.zip ./
unzip myfile.zip
GitHub地址:https://github.com/bloomreach/s4cmd
s4cmd
是一个为处理海量数据而生的 S3
存储命令行工具。它专门设计用于高并发场景,能够在传输大文件和大量小文件时显著加速。相比 AWS CLI
,s4cmd
更偏重于效率和性能,支持多线程和增量同步,让大规模数据上传或下载变得更加快捷可靠,是处理 S3
数据的理想选择。
GitHub地址:https://github.com/aws/aws-cli
官网:什么是 AWS Command Line Interface?
AWS CLI
是亚马逊官方推出的一款命令行工具,提供了几乎所有 AWS
服务的管理能力。从 S3
文件管理到启动 EC2
实例,再到配置 IAM
用户,只需一条命令就能轻松实现。它是云开发者的必备利器,不仅跨平台,而且支持脚本化操作,让你以最快速的方式管理 AWS
资源。
GitHub地址:https://github.com/kahing/goofys
Goofys
是一个让 S3
像本地文件系统一样挂载的工具。通过它,你可以直接访问 S3
上的文件,就像在本地硬盘上一样操作,不需要下载或同步。Goofys
不仅省去了繁琐的下载步骤,还优化了常见的读写操作,是在轻量数据访问场景下使用 S3
的高效选择,尤其适合日志分析和数据备份等需求。
这部分内容来源于S5cmd for High Performance Object Storage:
每个工具都有其特点,s3cmd功能全面,适合需要细粒度操作的用户,但性能相对较中规中矩;s4cmd基于 s3cmd 增强了速度,适合需要大量并发操作和大文件传输的场景;AWS CLI官方工具,支持所有 AWS 服务的管理,适合需要多种 AWS 服务集成的场景;goofys以本地挂载方式提供灵活性,适合希望将 S3 当作本地磁盘使用的用户;s5cmd以高性能为核心设计,适合对速度有极高需求的数据密集型任务。
对于我来说,主要就是极少数的图片同步到本地,需求场景很简单,怎么方便怎么来,所以用 s3cmd
就能满足,具体怎么选还是要看具体的业务场景。