#amazon-s3 #s3 #env-var #aws #aws-sdk #aws-cli #cloud

app ss3

又一个 S3 命令行工具... 但由环境变量驱动,按存储桶。

12 个版本

0.2.0-rc.12024年5月12日
0.1.2 2023年4月5日
0.1.1 2023年3月13日
0.0.8 2022年12月11日
0.0.5 2022年2月28日

#136命令行工具

每月 22 次下载

MIT/Apache

68KB
1.5K SLoC

又一个 S3 命令行工具,通过环境变量驱动,为每个存储桶或配置文件提供凭证。

注意:使用 v0.2.0-rc.1 版本,因为它已更新为使用 AWS SDK 1.x,并包括新的功能,如 cleancp ... --overwrite etag

关键点

  • 使用官方的 AWS-SDK-S3 和相关 AWS SDK 库。
  • 凭证由环境变量驱动(每个存储桶,每个配置文件,并回退到 AWS CLI 默认值)。
  • 旨在模拟大部分官方的 aws s3 ... 命令行(然而,它并不是非常死板)。
  • 计划最终提供库。

注意:已在 Mac 和 Linux 上测试(可能在 Windows 上无法工作,欢迎贡献)。

安装

# With Cargo install
cargo install ss3

命令示例

# list all buckets (assuming appropriate access)
ss3 ls s3://

# list all object and prefixes (-r for recursive)
ss3 ls s3://my-bucket -r

# list all object and prefixes (--info to display total count & size, also per extensions)
ss3 ls s3://my-bucket -r --info

# Upload a single file
ss3 cp ./image-01.jpg s3://my-bucket/my-folder

# Upload full folder (recursive)
ss3 cp ./ s3://my-bucket/my-folder/ -r

# Upload full folder with "text/html" content-type for file without extension 
# (rather than fall back "application/octet-stream")
ss3 cp ./ s3://my-bucket/my-folder/ -r --noext-ct "text/html"

# Upload full folder except the *.mp4
ss3 cp ./ s3://my-bucket/my-folder/ -e "*.mp4" -r

# Upload full folder but only the *.mp4 and *.jpg
ss3 cp ./ s3://my-bucket/my-folder/ -i "*.mp4" -i "*.jpg" -r

# Download a single file to a local directory (parent dirs will be )
ss3 cp s3://my-bucket/image-01.jpg ./.downloads/

# Download a full folder (for now make sure to add end '/' in the s3 URL to distinguish from object)
ss3 cp s3://my-bucket/my-folder/ ./.downloads/ -r

配置

以下将按照以下顺序解析凭证

  • 首先检查以下 SS3_BUCKET_... 环境中给定的存储桶
    • SS3_BUCKET_bucket_name_KEY_ID
    • SS3_BUCKET_bucket_name_KEY_SECRET
    • SS3_BUCKET_bucket_name_REGION
    • SS3_BUCKET_bucket_name_ENDPOINT(可选,用于 Minio)
  • 其次,当指定 --profile profile_name 时,检查以下 SS3_PROFILE_... 环境
    • SS3_PROFILE_profile_name_KEY_ID
    • SS3_PROFILE_profile_name_KEY_SECRET
    • SS3_PROFILE_profile_name_REGION
    • SS3_PROFILE_profile_name_ENDPOINT(可选,用于 Minio)
  • 当指定 --profile profile_name 且没有配置文件环境时,将检查默认的 AWS 配置文件
  • 作为最后的备选方案,使用默认的 AWS 环境变量
    • AWS_ACCESS_KEY_ID
    • AWS_SECRET_ACCESS_KEY
    • AWS_DEFAULT_REGION
    • AWS_ENDPOINT(可选,用于 Minio)

注意:配置文件和存储桶名称中的 '-' 字符将被替换为 '_' 以形成上述环境变量名称。因此,存储桶名称 my-bucket-001 将映射到环境变量 SS3_BUCKET_my_bucket_001_KEY_ID ...

其他示例


# ls
ss3 ls s3://my-bucket

# UPLOAD - cp file to s3 dir
ss3 cp ./.test-data/to-upload/image-01.jpg s3://my-bucket

# UPLOAD - cp dir to s3 dir
# NOTE: By default will skip if exists on s3 (use `--over write` to ovewrite)
ss3 cp ./.test-data/to-upload/ s3://my-bucket -r 

# UPLOAD - Check etag (simple etag/md5 only, not multi-part s3 etag)
# NOTE: For now, `--etag` is only implement on upload, not download
ss3 cp ./.test-data/to-upload/ s3://my-bucket -r --over etag --show-skip

# LIST - recursive
ss3 ls s3://my-bucket -r --info

# UPLOAD - rename
ss3 cp ./.test-data/to-upload/image-01.jpg s3://my-bucket/image-01-renamed.jpg

# UPLOAD - excludes
ss3 cp .test-data/to-upload s3://my-bucket -r -e "*.txt" --exclude "*.jpg"

# UPLOAD - includes
ss3 cp .test-data/to-upload s3://my-bucket -r -i "*.txt"

# UPLOAD - cp dir to s3 (recursive)
ss3 cp ./.test-data/to-upload/ s3://my-bucket/ggg -r

# DOWNLOAD - cp s3 file to local dir 
ss3 cp s3://my-bucket/image-01.jpg ./.test-data/downloads/

# DOWNLOAD - cp s3 file to local file (rename)
ss3 cp s3://my-bucket/image-01.jpg ./.test-data/downloads/image-01-rename.jpg

# DOWNLOAD - cp s3 folder to local dir
ss3 cp s3://my-bucket/ ./.test-data/downloads/

开发和测试

ss3集成测试可以通过以下命令运行:cargo testcargo nextest run

终端1

测试前的先决条件,以如下方式运行minio

docker run --name minio_1 --rm \
  -p 9000:9000 \
  -p 9900:9900 \
  -e "MINIO_ROOT_USER=minio" \
  -e "MINIO_ROOT_PASSWORD=miniominio" \
  minio/minio server /data --console-address :9900

然后,如果您想进入minio Web控制台,可以访问:http://127.0.0.1:9900/

终端2

然后可以使用以下命令运行测试:cargo testcargo nextest run

cargo test

# Or, with nextest
cargo nextest run
# This requires to have installed cargo-nextest: https://nexte.st/book/installation.html

依赖项

~30–41MB
~590K SLoC