概述
S3(Simple Storage Service)是AWS推出的对象存储服务,其HTTP REST API已成为整个行业的事实标准协议,几乎所有主流对象存储都宣称"兼容S3 API":
- 公有云:阿里云OSS、腾讯云COS、华为云OBS、Cloudflare R2、Backblaze B2
- 私有部署:MinIO、Ceph RGW、SeaweedFS
- 混合存储:本地文件系统+S3网关(如versitygw)
命令行工具对比Web控制台
| 场景 | Web控制台 | CLI工具 |
|---|---|---|
| 单个文件上传/下载 | ✅方便 | 可以,但杀鸡用牛刀 |
| 批量上传/同步 | ❌低效/卡顿 | ✅最高效 |
| 自动化定时任务 | ❌无法做 | ✅脚本+cron |
| CI/CD流水线集成 | ❌ | ✅ |
| 大规模数据迁移(TB级) | ❌ | ✅并发+断点续传 |
| 运维监控脚本 | ❌ | ✅ |
本文介绍几款CLI工具
S3工具生态全景
├── 通用多协议同步工具 rclone(支持50+云存储)
├── 传统S3CLI工具 s3cmd(Python,老牌稳定)
├── MinIO生态客户端 mc(MinIO官方,体验最佳)
├── 极速并行CLI工具 s5cmd(Go,比aws-cli快40x)
├── S3API网关/适配层 versitygw(把任意存储变成S3)
├── 专项高效数据复制 S3Copy(断点续传,流式传输)
rclone
官网,开源(GitHub,57.6K Star,5.1K Fork)S3瑞士军刀,支持超过70种云存储后端,包括Google Drive、Dropbox、OneDrive、SFTP、FTP、WebDAV等。若需要在多种不同的存储之间同步/迁移数据,rclone几乎是唯一选择。
部分功能列表
| 功能 | 说明 |
|---|---|
| sync | 单向同步(类似rsync),源→目标,删除目标多余文件 |
| copy | 复制文件,不删除目标端已有内容 |
| move | 移动后删除源端文件 |
| mount | 将远端存储挂载为本地文件系统(FUSE) |
| serve | 以HTTP/WebDAV/S3/SFTP等协议对外提供存储服务 |
| bisync | 双向同步(实验性功能) |
| ls/lsd/lsf | 列出文件/目录 |
| check | 校验两端文件一致性(MD5/SHA1/ETag) |
| crypted remote | 透明加密,文件在传输和存储时自动加密/解密 |
| dedupe | 重复文件检测与删除 |
| size | 统计远端存储使用量 |
安装
支持多种安装方式:
bash
curl https://rclone.org/install.sh | sudo bash
brew install rclone
scoop install rclone
winget install Rclone.Rclone
docker run --rm \
--volume ~/.config/rclone:/config/rclone \
--volume ~/data:/data:shared \
rclone/rclone ls remote:bucket
执行命令rclone config开启交互式配置,写文件~/.config/rclone/rclone.conf,支持直接编辑该文件,示例:
conf
[mycos]
type = s3
provider = TencentCOS
access_key_id = AKIDxxxxxx
secret_access_key = xxxxxxxx
endpoint = cos.ap-beijing.myqcloud.com
命令行示例:
bash
# 同步本地目录到S3(增量同步)
rclone sync /local/path remote:mybucket/prefix
# 并发上传
rclone copy /local/path remote:mybucket \
--transfers 32 \
--s3-upload-concurrency 8 \
--progress
# 挂载S3为本地目录
rclone mount remote:mybucket /mnt/s3 --daemon
# 以S3协议对外暴露本地目录
rclone serve s3 /local/path --addr :9000
# 列出存储桶
rclone lsd remote:
# 校验文件一致性
rclone check /local/path remote:mybucket
# rclone透明加密同步
rclone copy remote:source crypt:destination
# 限速上传,适合生产环境,避免影响其他业务
rclone copy source: dest: --bwlimit 10M
# 只同步特定类型文件
rclone copy source: dest: --include "*.jpg" --include "*.png"
# 排除特定目录
rclone sync source: dest: --exclude ".git/**"
# 仅同步最近7天修改的文件
rclone copy source: dest: --max-age 7d
s3cmd
项目首页,开源(GitHub,4.9K Star,905 Fork)基于Python的S3命令行。
功能
| 命令 | 功能 |
|---|---|
mb/rb |
创建/删除存储桶 |
ls |
列出存储桶或对象 |
put/get |
上传/下载单个文件 |
del |
删除对象 |
sync |
目录同步(类似rsync) |
cp/mv |
S3内部复制/移动 |
info |
查看对象元信息 |
setacl/getacl |
ACL权限管理 |
ws-create/ws-delete |
静态网站托管配置 |
expire |
设置对象生命周期规则 |
sign |
生成预签名URL |
实战
安装及配置
bash
pip install s3cmd
brew install s3cmd
apt-get install s3cmd
# 交互式配置
s3cmd --configure
配置文件示例:
ini
[default]
access_key = minioadmin
secret_key = minioadmin
host_base = localhost:9000
host_bucket = localhost:9000/%(bucket)s
use_https = False
signature_v2 = False
命令行示例:
bash
# 创建存储桶
s3cmd mb s3://mybucket
# 上传文件
s3cmd put /local/file.txt s3://mybucket/path/file.txt
# 上传整个目录
s3cmd put -r /local/dir s3://mybucket/prefix/
# 增量同步,--delete删除目标端多余文件
s3cmd sync /local/dir s3://mybucket/prefix/ --delete
# 下载文件
s3cmd get s3://mybucket/file.txt /local/file.txt
# 生成1小时有效的预签名URL
s3cmd signurl s3://mybucket/file.txt +3600
# 设置ACL公开访问
s3cmd setacl s3://mybucket/file.txt --acl-public
# 列出所有存储桶
s3cmd ls
# 查看对象详情:ETag、大小、存储类等
s3cmd info s3://mybucket/file.txt
s5cmd
基于Go、开源(GitHub,4.1K Star,337 Fork)极速S3客户端,通过goroutine实现的高度并发执行引擎,在大量小文件操作场景下,性能可达到AWS CLI的32~40倍。
官方实测:整体性能最高提升40倍,s5cmd天生并发,而AWS CLI默认单线程。
| 测试场景 | s5cmd | AWSCLI | 提升倍数 |
|---|---|---|---|
| 上传10,000个小文件 | 12秒 | 6分24秒 | ~32x |
| 下载100GB数据集 | 1分40秒 | 14分22秒 | ~8.6x |
| 列出并同步100万对象 | 48秒 | 11分09秒 | ~13.9x |
功能
| 功能 | 说明 |
|---|---|
| 高并发执行 | 数千goroutine并行处理,CPU利用率极高 |
| 通配符支持 | 多级glob模式(s3://bucket/logs/2024//*.log) |
| 批量命令文件 | 从文件读取命令序列批量执行(s5cmdruncommands.txt) |
| Tab补全 | 内置Shell补全,包括桶名和路径提示 |
| 跨区域操作 | 自动处理不同区域的端点路由 |
| 零依赖 | 单一二进制,无需安装Python/Node等运行时 |
使用场景
- ✅大规模数据迁移:10万+文件的批量迁移,效率吊打其他工具
- ✅机器学习数据集处理:AI训练数据集的批量上传/下载,节省宝贵GPU等待时间
- ✅CI/CD流水线:快速将构建产物推送到S3
- ✅定时批量清理:配合
cron实现大规模对象清理 - ❌不适合需要多云/非S3存储的场景(仅支持S3兼容协议)
- ❌不适合需要细粒度ACL/生命周期配置的场景(功能有限)
实战
安装
bash
brew install peak/tap/s5cmd
go install github.com/peak/s5cmd/v2@latest
当然也支持从GitHub Release页面下载二进制安装程序。
命令示例
bash
# 基础文件操作
s5cmd cp s3://source-bucket/file.txt s3://dest-bucket/file.txt
s5cmd cp /local/file.txt s3://mybucket/path/
s5cmd cp s3://mybucket/file.txt /local/
# 高并发同步(默认并发数 256)
s5cmd sync s3://source/prefix/ /local/dest/
# 上传整个目录(并发 512 个 worker)
s5cmd --numworkers 512 cp /local/dir/* s3://mybucket/prefix/
# 通配符批量下载
s5cmd cp "s3://mybucket/logs/2024/**/*.log" /local/logs/
# 批量删除
s5cmd rm "s3://mybucket/temp/*"
# 列出对象
s5cmd ls s3://mybucket/prefix/
# 从命令文件批量执行(适合复杂迁移任务)
cat commands.txt
# cp s3://source/file1.txt s3://dest/file1.txt
# cp s3://source/file2.txt s3://dest/file2.txt
# rm s3://old-bucket/deprecated-file.txt
s5cmd run commands.txt
# 查看桶列表
s5cmd ls
# 对象信息
s5cmd du s3://mybucket/prefix/
mc
MinIO官方开源(GitHub,3.5K Star,677 Fork) S3客户端,支持标准S3操作,还深度集成MinIO特有的企业功能(副本策略、加密、审计日志等)。
功能清单
| 命令组 | 功能 |
|---|---|
alias set/list/remove |
管理多个S3端点别名 |
cp/mirror |
复制/镜像(持续同步) |
ls/find |
列出/搜索对象 |
cat/pipe |
流式读取对象内容 |
admin |
MinIO管理命令(仅MinIO可用) |
policy |
存储桶策略管理 |
tag |
对象标签管理 |
stat |
对象元信息 |
diff |
比较两个桶的差异 |
watch |
监听存储桶事件变化(实时) |
event |
配置事件通知 |
ilm |
生命周期管理(Information Lifecycle Management) |
quota |
存储桶配额管理 |
replicate |
跨区域复制配置 |
实战
安装
bash
curl https://dl.min.io/client/mc/release/linux-amd64/mc -o /usr/local/bin/mc && chmod +x /usr/local/bin/mc
brew install minio/stable/mc
还支持从GitHub Release页面下载二进制安装程序。
命令行示例
bash
# 添加 S3 端点别名
mc alias set mycloud https://s3.amazonaws.com AKID SECRET
mc alias set myminio http://localhost:9000 minioadmin minioadmin
# 列出所有存储桶
mc ls mycloud
# 复制文件
mc cp /local/file.txt mycloud/mybucket/file.txt
# 持续镜像增量同步,类似rclone sync
mc mirror mycloud/source-bucket mycloud/dest-bucket
# 实时监听存储桶事件
mc watch myminio/mybucket
# 查找超过 30 天未访问的文件
mc find myminio/mybucket --older-than 30d
# 存储桶策略(设置公开只读)
mc policy set download myminio/mybucket
# MinIO 管理:查看集群状态
mc admin info myminio
# MinIO 管理:添加用户
mc admin user add myminio newuser newpassword
# MinIO 管理:设置副本
mc replicate add myminio/source-bucket --remote-bucket "https://user:pass@remote/dest-bucket"
# 流式读取(适合日志文件)
mc cat myminio/mybucket/app.log | grep ERROR
MinIO专属功能示例:
bash
# 配置跨区域复制(Active-Active 模式)
mc replicate add myminio/primary \
--remote-bucket "https://remote-minio/replica" \
--replicate "delete,delete-marker,existing-objects"
# 设置加密(SSE-S3)
mc encrypt set SSE-S3 myminio/mybucket
# 查看存储桶统计
mc du myminio/mybucket
# 对象锁定(WORM - Write Once Read Many)
mc retention set --default COMPLIANCE 30d myminio/mybucket
S3Copy
开源(GitHub)命令行工具,专为高效复制数据到S3存储而设计。无论是从本地文件、HTTP URL还是其他S3存储,它都能提供快速、可靠的传输体验,并支持断点续传、分块上传等高级特性。
备注:新项目,仅由几个.go文件组成,学习或参考。
核心功能
- 多源支持:本地文件/目录、HTTP/HTTPS URL、S3存储桶之间自由复制
- 智能跳过:基于ETag自动跳过已存在的文件,避免重复传输:
- 本地文件:计算MD5哈希值
- S3对象:使用现有ETag
- HTTP源:使用响应头中的ETag(如果有)
- 分块上传:超过32MB的文件自动使用分块上传,提升大文件传输效率
- 断点续传:传输中断后可从中断点继续,无需重新开始;只需再次运行相同命令即可恢复:
- 自动检测已传输的文件和分块
- 跳过已完成的文件
- 从中断的分块上传处继续
- 并发操作:可配置的并发上传数量,充分利用带宽资源
- 实时进度:每秒以JSON格式输出传输进度,便于监控
- 内存优化:流式处理大文件,避免内存溢出问题,策略:
- 分块流式传输:同时下载和上传,避免一次性加载整个文件
- 内存控制:使用固定大小的缓冲区,避免内存堆积
- 支持续传:可从中断点恢复下载
- 高效缓冲:优化缓冲区使用,平衡性能和内存占用
- 自动建桶:目标桶不存在时自动创建,简化操作流程
- 智能重试:网络故障时自动重试,重试次数可配置;默认重试最多3次,每次间隔3秒。可通过
--max-retries参数自定义重试次数。 - 同源优化:同一账户和区域的S3复制使用CopyObject API,节省带宽并提高性能
工具能处理各种错误情况,所有错误都会记录详细信息,并更新内部状态以保持一致性:
- 网络中断(带可配置的重试逻辑)
- 认证错误
- 权限问题
- 大文件内存限制
- 无效端点格式
性能优化提示
- 并发上传:增加--T值提高吞吐量(需平衡系统资源)
- 分块大小:larger分块减少API调用但增加内存使用
- 网络选择:使用同一区域的端点以获得更好性能
- 内存使用:工具设计为无论文件大小都使用最小内存
- 重试设置:根据网络稳定性调整--max-retries
- 同源复制:同一账户和区域内的S3到S3复制,工具会自动使用更高效的CopyObject API,节省带宽
安装:
bash
npm install
go mod download
go build -o s3copy .
设置环境变量
bash
# 源S3配置(从S3复制时需要)
export SRC_ACCESS_KEY=xx
export SRC_SECRET_KEY=xx
export SRC_S3_REGION=xx
# 目标S3配置(始终需要)
export DST_ACCESS_KEY=xx
export DST_SECRET_KEY=xx
export DST_S3_REGION=xx
备注:SRC_S3_REGION和DST_S3_REGION可选配置,默认us-east-1
命令行示例:
bash
# 从本地文件/目录复制到S3
# 复制单个文件
s3copy --from-file /path/to/file.txt --to http://region.s3.com/oss1001
# 复制整个目录
s3copy --from-file /path/to/directory --to http://region.s3.com/oss1001
# 从URL复制到S3,一行一个可下载资源文件,支持http/https
s3copy --from-url urls.txt --to http://region.s3.com/oss1001
# 从S3复制到S3
s3copy --from-s3 http://oss1001.region.s4.comm --to http://region.s3.com/oss1001
# 使用自定义设置进行复制
s3copy --from-file /large-dataset \
--to http://region.s3.com/backup \
--T 20 \
--part-size 67108864 \
--max-retries 5 \
-vv
| 参数 | 描述 | 默认值 |
|---|---|---|
--T |
并发上传线程数量 | 10 |
--part-size |
分块上传大小(字节) | 33554432(32MB) |
-q,--quiet |
静默模式(无输出) | false |
-v,--verbose |
增加日志详细程度 | 0 |
--max-retries |
失败上传的重试次数 | 3 |
工具支持通过-v参数控制日志输出详细程度,不同级别的含义如下:
| 参数 | 日志级别 | 含义 |
|---|---|---|
不加-v |
ERROR/WARN | 只输出错误或警告信息 |
-v |
INFO | 输出主要流程信息(如"开始上传"、"完成下载") |
-vv |
DEBUG | 输出详细调试信息(如请求头、参数) |
-vvv |
TRACE | 输出最详细信息(如完整请求/响应体、堆栈) |
端点格式支持
- 桶作为子域名:http://bucket.endpoint.com
- 桶在路径中:http://endpoint.com/bucket
工具每秒以JSON格式输出进度:
json
{
"total_size": 1048576000, // 总字节数
"migrated_size": 524288000,
"total_objects": 7,
"migrated_objects": 2,
"fail_objects": 0,
"average_speed": 10485760, // 字节/秒
"progress": 50.00
}
对比及选型
| 工具 | 定位 | S3以外协议 | 加密备份 | 挂载FS |
|---|---|---|---|---|
| rclone | 通用多云同步 | ✅70+ | ✅(可选) | ✅FUSE |
| s3cmd | 老牌S3CLI | ❌仅S3 | ❌ | ❌ |
| mc | MinIO生态客户端 | ❌仅S3/MinIO | ❌ | ❌ |
| s5cmd | 极速并行S3CLI | ❌仅S3 | ❌ | ❌ |
选型决策树
主要需求是什么?
├── 备份数据(需要版本历史/加密/快照)
│ └── → restic(加密备份首选)
├── 把S3当本地磁盘用(应用程序直接读写)
│ └── → goofys(高性能FUSE挂载)
│ └── 如果需要多云、非S3→rclone mount
├── 海量数据迁移、极速批量操作
│ └── → s5cmd(性能最高,比AWS CLI快40x)
│ └── 如果需要多云协议 → rclone
├── 已有本地存储,想暴露S3 API接口
│ └── → versitygw(S3网关,无需迁移数据)
├── 从多个 HTTP URL 批量下载并上传到 S3
│ └── → S3Copy(专为搬运场景设计)
├── 数据库MinIO,需要深度管理:用户副本、监控
│ └── → mc(MinIO官方客户端,功能最全)
├── 跨云迁移、需要支持多种非S3协议
│ └── → rclone(支持70+云存储,一工具走天下)
└── 老旧脚本维护,Python环境,需要ACL、生命周期等高级S3功能
└── → s3cmd(功能成熟,Python生态友好)