在Linux服务器之间拷贝文件,最直接高效的工具是scp和rsync,前者适合一次性传输,后者擅长增量同步和断点续传。
scp和rsync哪个好?核心差异对比
实际操作中,选scp还是rsync取决于具体场景,两者都基于SSH加密传输,但设计思路不同,下面表格能帮你快速分清:
| 对比项 | scp | rsync |
|---|---|---|
| 传输方式 | 全量拷贝,每次覆盖所有文件 | 差量传输,只同步变化部分 |
| 速度 | 简单场景更快,无需额外计算 | 增量场景极快,首次全量会稍慢 |
| 断点续传 | 不支持,中断后需重新开始 | 支持,可从中断处继续 |
| 保留属性 | 默认保留部分属性(时间、权限) | 可通过参数灵活保留属性 |
| 适用场景 | 临时、小文件、一次性的拷贝 | 定期备份、大量文件、镜像同步 |
| 命令复杂度 | 简单,参数少 | 稍复杂,但功能强大 |
行业共识认为,当需要频繁同步或传输大文件时,rsync是更优选择;而偶尔传几个小文件,scp更省事。
什么场景选择scp
- 临时从本地传一个配置文件到单台服务器。
- 下载远程服务器上的日志文件,几MB大小。
- 不需要考虑差异,只需完整复制一份。
什么场景选择rsync
- 每天定时同步网站目录到备份服务器。
- 传输几百GB的数据库备份,支持断点续传大大降低风险。
- 在两个服务器之间保持目录结构一致,且只传输新增或修改的文件。
linux远程拷贝文件命令实战:scp详解
scp命令是OpenSSH组件的一部分,几乎在所有Linux发行版中预装,无需额外安装。
从本地拷贝到远程服务器
基本语法:
scp /本地路径/文件 用户名@远程IP:/远程路径/
示例:将本地的 nginx.conf 传到 168.1.10 的 /etc/nginx/ 目录下:
scp /etc/nginx/nginx.conf root@192.168.1.10:/etc/nginx/
输入密码后即可完成传输。
从远程服务器拷贝到本地
只需交换路径顺序:
scp 用户名@远程IP:/远程路径/文件 /本地路径/
示例:下载远程服务器上的 access.log:
scp root@192.168.1.10:/var/log/nginx/access.log /tmp/
常用参数解读
-P指定远程SSH端口(大写P),默认22。-r递归拷贝整个目录,传输目录时必加。-C启用压缩传输,适合文本文件,可节省带宽但增加CPU负载。-p保留原始文件的修改时间、访问时间和权限模式。-v显示详细输出,便于调试。
示例:递归拷贝目录,指定端口为2222,启用压缩:
scp -r -P 2222 -C /data/backup/ root@192.168.1.10:/data/backup/
安全注意事项
- 使用强密码或SSH密钥认证,避免使用root直接登录。
- 传输前确认目标路径的写权限,否则会报错。
- 避免在传输过程中中断连接,因为scp不支持断点续传,重传会从头开始。
rsync:跨服务器文件同步工具的高级用法
rsync因其“只传输差异块”的特性,成为跨服务器文件同步工具的首选,它同样基于SSH,但比scp智能得多。
基本同步命令
从本地同步到远程(首次等同于全量拷贝):
rsync -avz /本地路径/ 用户名@远程IP:/远程路径/
-a归档模式,保留权限、时间、符号链接等属性。-v显示同步过程。-z传输时压缩数据。
示例:同步网站目录 /var/www/html 到备份服务器:
rsync -avz /var/www/html/ root@192.168.1.10:/backup/html/
注意路径末尾的斜杠:带斜杠表示同步目录内的内容,不带斜杠表示同步目录本身。
增量同步的优势
第二次运行同样的命令,rsync会对比源和目标文件,只传输发生变化的部分,对于大文件,它通过分块校验实现差分传输,速度提升明显。
断点续传实战
在传输大文件时,如果网络中断,加上 --partial 参数,rsync会保留已传输的部分,下次执行时继续传输,而不是从头开始:
rsync -avz --partial /大文件.tar.gz root@192.168.1.10:/backup/
这是rsync相比scp最实用的功能之一。
结合cron实现定时同步
用crontab设置定时任务,实现自动化备份:
crontab -e
添加一行,每天凌晨2点同步:
0 2 rsync -avz --delete /var/www/html/ root@192.168.1.10:/backup/html/
--delete 参数会删除目标目录中源目录已不存在的文件,保持两边完全一致。
其他linux服务器之间传输文件的方法
除scp和rsync外,还有几种小众但实用的方案,适合特定情况。
tar+ssh组合传输大文件
用管道将tar打包后直接通过SSH发送,省去中间文件:
tar czf - /本地目录 | ssh root@192.168.1.10 "tar xzf - -C /远程目标目录"
优点:全程压缩,脚本友好,缺点:不支持断点续传。
nc(netcat)临时文件传输
适合两个服务器之间快速传输,不经过SSH加密,性能极高,但安全性低,仅建议内网使用。
在接收端监听:
nc -l 1234 > 接收文件.tar.gz
在发送端发送:
nc 192.168.1.10 1234 < 发送文件.tar.gz
传输完成后自动断开,无进度提示,适合一次性大文件传输到内网机器。
使用lrzsz在SSH终端中传输
如果通过SSH客户端连接到服务器,可以用sz和rz命令,直接在终端里上传下载文件,无需额外工具,服务器端需安装lrzsz包:
yum install lrzsz -y
发送文件到本地:
sz 文件名
接收文件到服务器:
rz
会弹出文件选择对话框,适合小文件临时交互。
传输优化与安全策略
提升传输体验和安全性,可以参考以下建议。
使用SSH密钥免密传输
生成密钥对,将公钥追加到远程服务器的
~/.ssh/authorized_keys中,之后scp和rsync都无需输入密码:
ssh-keygen -t rsa -b 4096
ssh-copy-id root@192.168.1.10
密钥认证不仅方便,还比密码更安全,建议配合ssh-agent管理私钥。
限速传输
如果担心文件传输占用过多带宽影响业务,rsync和scp都支持限速:
- scp:通过
-l参数限制带宽(单位Kbps)scp -l 1000 大文件.tar.gz root@192.168.1.10:/tmp/限制为1000Kbps,约125KB/s。
- rsync:通过
--bwlimit参数限制(单位KB/s)rsync -avz --bwlimit=1000 大文件.tar.gz root@192.168.1.10:/tmp/
防火墙与端口配置
远程SSH端口默认22,如果被防火墙阻挡,需在iptables或云安全组中放行,建议将SSH端口改为非标准端口,降低被扫描风险,传输时scp和rsync使用相同的端口,统一通过-P或-e "ssh -p 2222"指定。
Q&A:Linux远程拷贝文件常见问题
Q1: scp传输大文件中断怎么办?
scp本身不支持断点续传,中断后只能重新传输,替代方案:改用rsync的--partial参数,从断点处继续,如果必须用scp,可以先将文件分块,分别传输后合并,但操作繁琐,不推荐。
Q2: rsync如何实现定时同步?
使用cron任务,例如每天凌晨3点执行同步,crontab配置为0 3 rsync -avz --delete /源路径/ 用户@远程IP:/目标路径/,注意日志重定向,避免邮件轰炸:>/dev/null 2>&1,建议先在命令行测试无误后再加入计划任务。
Q3: 如何查看传输速度?
scp默认不显示实时速度,但可以通过-v参数看到最终统计,rsync加上--progress参数,实时显示每个文件的传输进度和速度,使用pv工具配合管道,也可以监控数据传输速率:cat 文件 | pv | ssh 用户@远程IP "cat > 文件"。
scp和rsync覆盖了从简单到复杂的所有远程拷贝场景,rsync凭借增量同步和断点续传优势,成为生产环境的首选,掌握这两个工具,就能高效处理linux服务器之间的文件传输需求。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/599606.html



