
在 Linux 系统下,我经常使用 scp 命令拷贝传输文件,小文件传输中断无所谓,大不了重新传一次,但是如果是大文件使用 scp 命令你拷贝的时候中间中断,那就只能重新传,别无它法。
因为 SCP(Secure Copy Protocol)是基于 SSH 实现文件传输,协议本身不支持断点续传机制,所以一旦传输中断,只能从头开始。对于大文件传输或是网络不稳定时候,建议慎用!
这里我推荐使用以下三种方案,任何移动都可以轻松达到在 Linux 下文件传输断点续传的目的。
rsync 是 Linux 下最强大的文件同步工具,支持断点续传,且能通过 SSH 隧道传输,可完全替代 SCP。
用法:
# 本地到远程(替代 scp localfile user@remote:/path)rsync -avz --progress localfile user@remote:/path/# 远程到本地(替代 scp user@remote:/path/remotefile ./)rsync -avz --progress user@remote:/path/remotefile ./参数说明:
示例:
# 传输大文件时网络中断,重新执行相同命令即可续传rsync -avzP linux-file.tar.gz user@server:/data/# 限制带宽(避免占用全部网络)rsync -avzP --bwlimit=1000 large.iso user@server:/data/# --bwlimit=1000 表示限制为 1000KB/s目录同步与增量备份# 同步整个目录,自动跳过已存在的文件rsync -avzP /local/files/ user@server:/remote/files/# 注意:末尾的斜杠很重要!# /local/files/ → 同步目录内容# /local/files → 同步目录本身# 删除远程端本地已不存在的文件(严格镜像)rsync -avzP --delete /local/files/ user@server:/remote/files/OpenSSH 自带的 sftp 命令行工具支持交互式和批处理模式,具备断点续传能力。
用法:
# 连接远程服务器sftp user@remote-server# 在 sftp 提示符下使用sftp> reget remote-file local-file # 续传下载(remote → local)sftp> reput local-file remote-file # 续传上传(local → remote)sftp> !ls # 执行本地命令sftp> bye # 退出脚本
#!/bin/bash# sftp-resume.sh - SFTP 断点续传脚本HOST="server.example.com"USER="backup"LOCAL_FILE="/data/archive.tar.gz"REMOTE_FILE="/backups/archive.tar.gz"# 使用 Here Document 执行批处理命令sftp -o BatchMode=no -b - $USER@$HOST << EOFreput $LOCAL_FILE $REMOTE_FILEbyeEOF示例:
# 指定端口和非默认密钥sftp -P 2222 -i ~/.ssh/custom_key user@host# 恢复被中断的下载(reget = resume get)sftp> reget /remote/large-file.zip ./large-file.ziplftp 是功能强大的文件传输客户端,支持多协议(SFTP、FTP、HTTP 等),内置断点续传和镜像功能。
安装:
# Debian/Ubuntusudo apt install lftp# RHEL/CentOSsudo yum install lftp用法:
# 连接并传输lftp sftp://user@remote-server -e "set sftp:auto-confirm yes; put -c local-file -o remote-file; bye"# 参数说明:# -c = 断点续传(continue)# -o = 指定远程路径交互式会话
lftp sftp://user@remote-server# 在 lftp 提示符下lftp> set sftp:auto-confirm yes # 自动接受主机密钥lftp> put -c bigfile.iso # 上传并支持续传lftp> get -c remote-file.zip # 下载并支持续传lftp> mirror -c local-dir remote-dir # 镜像同步并续传lftp> bye高级:自动重试和镜像
# 自动重试 5 次,断线后等待 10 秒重连lftp -u user,pass sftp://server -e "set net:max-retries 5;set net:reconnect-interval-base 10;set net:timeout 30;mirror -c --parallel=3 /local/data /remote/backup;bye"假设数据库备份场景,需要传输 100GB 的数据库备份:
#!/bin/bash# large-file-transfer.sh - 安全的大文件传输脚本FILE="db-backup-$(date +%Y%m%d).sql.gz"SOURCE="/backup/$FILE"DEST="backup-server:/data/backups/"LOG="/var/log/transfer.log"# 使用 rsync 的断点续传 + 校验rsync -avzP --checksum \ --partial-dir=.rsync-partial \ --timeout=300 \ --contimeout=60 \ -e "ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=3" \ "$SOURCE" "$DEST" 2>&1 | tee -a "$LOG"# 检查传输结果if [ $? -eq 0 ]; then echo "[$(date)] 传输成功: $FILE" >> "$LOG" # 可选:删除本地文件或发送通知else echo "[$(date)] 传输失败或中断: $FILE" >> "$LOG" echo "执行相同命令即可续传"fi参数说明:
--checksum:校验文件完整性,避免续传时数据损坏
--partial-dir:将部分文件存放在隐藏目录,保持目标目录整洁
--timeout:数据传输超时时间(秒)
--contimeout:连接超时时间
-e "ssh ...":传递 SSH 参数,保持连接活跃
在 Linux 系统,特别是服务器环境中,非常不建议使用 scp 进行大文件传输。不论是使用 rsync、 sftp 、 lftp 任何一种工具都支持断点续传,他们才是最好的选择,Linux 下大文件实现断点续传的利器。
欢迎关注我,带你解锁更多 Linux 相关技能!
-END-
关注我的公众号,看文不迷路👇👇👇
