使用Bash脚本将Amazon S3文件迁移至FTP的正确命令咨询
如何用Bash脚本将Amazon S3文件迁移到FTP服务器
我来帮你搞定这个问题!你之前的rsync命令没法工作主要有两个核心原因:
- rsync本身不支持直接访问S3的
s3://协议,它只能处理本地文件或者通过SSH访问的远程文件系统; - 你的命令里源和目标都是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
相关产品推荐
相关产品推荐

