You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Bash脚本将Amazon S3文件迁移至FTP的正确命令咨询

如何用Bash脚本将Amazon S3文件迁移到FTP服务器

我来帮你搞定这个问题!你之前的rsync命令没法工作主要有两个核心原因:

  1. rsync本身不支持直接访问S3的s3://协议,它只能处理本地文件或者通过SSH访问的远程文件系统;
  2. 你的命令里源和目标都是S3路径,完全没涉及到FTP服务器,这显然偏离了你的需求。

下面给你两种实用的Bash脚本方案,任选其一都能完成S3到FTP的文件迁移:

方案一:AWS CLI + lftp(推荐,无需挂载)

这个方案不需要把S3挂载到本地,而是先通过AWS CLI下载文件到临时目录,再用lftp上传到FTP,适合大多数场景,尤其是需要处理大量文件或者不想挂载文件系统的情况。

前置准备

  • 安装并配置好AWS CLI:执行aws configure输入你的AWS Access Key、Secret Key、默认区域等信息;
  • 安装lftp(大多数Linux发行版可以用包管理器安装,比如apt install lftp或者yum install lftp)。

示例脚本

#!/bin/bash

# 配置参数
S3_BUCKET_PATH="s3://your-bucket-name/folder/"  # 你的S3源路径
FTP_HOST="ftp.your-server.com"                  # FTP服务器地址
FTP_USER="your-ftp-username"                    # FTP用户名
FTP_PASS="your-ftp-password"                    # FTP密码
FTP_TARGET_DIR="/target/folder/on/ftp/"         # FTP上的目标目录
LOCAL_TEMP_DIR="/tmp/s3-to-ftp-temp"            # 本地临时目录

# 创建临时目录
mkdir -p "$LOCAL_TEMP_DIR"

# 从S3下载文件到临时目录
echo "开始从S3下载文件..."
aws s3 sync "$S3_BUCKET_PATH" "$LOCAL_TEMP_DIR" --delete

# 上传临时目录的文件到FTP
echo "开始上传到FTP服务器..."
lftp -e "mirror -R '$LOCAL_TEMP_DIR' '$FTP_TARGET_DIR'; quit" -u "$FTP_USER","$FTP_PASS" "$FTP_HOST"

# 清理临时目录
echo "清理本地临时文件..."
rm -rf "$LOCAL_TEMP_DIR"

echo "迁移完成!"

方案二:s3fs挂载S3 + rsync

如果你更习惯用rsync,可以先把S3存储桶挂载到本地文件系统,再用rsync同步到FTP服务器。

前置准备

  • 安装s3fs:比如Ubuntu用apt install s3fs,CentOS用yum install s3fs-fuse;
  • 配置s3fs凭证:把你的AWS Access Key和Secret Key写入~/.passwd-s3fs文件,格式为ACCESS_KEY:SECRET_KEY,然后设置权限chmod 600 ~/.passwd-s3fs。

示例脚本

#!/bin/bash

# 配置参数
S3_BUCKET="your-bucket-name"                    # S3存储桶名称
S3_FOLDER="folder/"                             # S3里的目标文件夹
LOCAL_MOUNT_POINT="/mnt/s3-mount"               # 本地挂载点
FTP_HOST="ftp.your-server.com"                  # FTP服务器地址
FTP_USER="your-ftp-username"                    # FTP用户名
FTP_PASS="your-ftp-password"                    # FTP密码
FTP_TARGET_DIR="/target/folder/on/ftp/"         # FTP目标目录

# 创建挂载点并挂载S3
mkdir -p "$LOCAL_MOUNT_POINT"
s3fs "$S3_BUCKET:$S3_FOLDER" "$LOCAL_MOUNT_POINT" -o passwd_file=~/.passwd-s3fs

# 用rsync同步到FTP(注意rsync需要通过lftp或者ftp协议,这里用lftp的mirror模拟rsync的同步逻辑)
echo "开始同步S3文件到FTP..."
lftp -e "mirror -R '$LOCAL_MOUNT_POINT' '$FTP_TARGET_DIR'; quit" -u "$FTP_USER","$FTP_PASS" "$FTP_HOST"

# 卸载S3挂载点
fusermount -u "$LOCAL_MOUNT_POINT"

echo "迁移完成!"

额外提示

  • 如果你的FTP服务器支持SFTP(SSH文件传输),可以直接用rsync通过SFTP同步,命令格式为rsync -avz --progress "$LOCAL_MOUNT_POINT/" "$FTP_USER@$FTP_HOST:$FTP_TARGET_DIR";
  • 对于大文件,建议在aws s3 sync里加上--multipart-chunk-size参数优化下载速度;
  • 凭证安全:不要把明文密码写在脚本里,可以用环境变量或者加密文件读取,比如FTP_PASS=$(cat /path/to/encrypted/pass | decryption-tool);
  • 可以添加日志输出,把脚本的输出重定向到日志文件,方便后续排查问题。

内容的提问来源于stack exchange,提问作者Ganesh Pitchai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:44:35