如何通过AWS CLI高效将S3文件直接传输至SFTP?
高效将AWS S3文件直接传输至SFTP的解决方案
原命令管道中断的原因
你之前用的单文件管道传输方式,依赖sftp的交互式会话,这类会话在网络波动、文件较大时容易因超时或连接不稳定中断;同时该方式无法批量处理数百个文件,效率低下。
方案1:循环+稳定SFTP参数批量传输
通过遍历S3文件列表,逐个流式传输并加密,同时给sftp添加连接稳定参数:
aws s3 ls s3://your-bucket/ --recursive | grep -v "^PRE" | awk '{print $4}' | while read filename; do aws s3 cp s3://your-bucket/"$filename" - | gpg --encrypt --recipient gg@decrpt.com | sftp -o BatchMode=yes -o ServerAliveInterval=15 -o ConnectTimeout=30 account@hostname.com:/data/sample_data/"$filename".gpg done
BatchMode=yes:禁用交互式密码提示,避免会话卡住ServerAliveInterval=15:每15秒发送保活包,防止连接被远端断开ConnectTimeout=30:设置连接超时时间,避免无限等待
方案2:用lftp实现自动重连的流式传输
lftp对SFTP连接的稳定性更好,支持自动重连,适合批量大文件传输:
# 密钥登录版本 aws s3 ls s3://your-bucket/ --recursive | grep -v "^PRE" | awk '{print $4}' | while read filename; do aws s3 cp s3://your-bucket/"$filename" - | gpg --encrypt --recipient gg@decrpt.com | lftp -e "set sftp:connect-program 'ssh -i /path/to/your/private-key'; put -o /data/sample_data/"$filename".gpg -; exit" sftp://account@hostname.com done # 密码登录版本(不推荐,建议用密钥) aws s3 ls s3://your-bucket/ --recursive | grep -v "^PRE" | awk '{print $4}' | while read filename; do aws s3 cp s3://your-bucket/"$filename" - | gpg --encrypt --recipient gg@decrpt.com | lftp -e "put -o /data/sample_data/"$filename".gpg -; exit" sftp://account:your-password@hostname.com done
lftp会自动处理连接中断后的重连,无需手动干预,大幅提升批量传输的可靠性。
方案3:并行传输提升效率(适合多核/高带宽环境)
用GNU Parallel实现多文件同时传输,最大化利用带宽:
aws s3 ls s3://your-bucket/ --recursive | grep -v "^PRE" | awk '{print $4}' | parallel -j 8 'aws s3 cp s3://your-bucket/{} - | gpg --encrypt --recipient gg@decrpt.com | sftp -o BatchMode=yes -o ServerAliveInterval=15 account@hostname.com:/data/sample_data/{}.gpg'
-j 8:同时处理8个文件,可根据网络带宽和服务器负载调整数值(建议从5开始测试)- 需提前安装GNU Parallel(
apt install parallel或brew install parallel)
内容的提问来源于stack exchange,提问作者lighter
相关产品推荐
相关产品推荐

