Linux从另一个服务器拷贝文件,最直接的做法是使用scp、rsync或sftp命令,其中scp适合一次性快速传输,rsync擅长增量同步,sftp则提供交互式操作体验。
在实际运维中,文件拷贝的跨服务器场景非常普遍,无论是迁移数据、备份配置,还是同步日志,都绕不开这几种工具,很多人纠结到底该用哪个,其实核心就看三点:网络稳定性、文件大小和同步频率,下面我结合具体操作和对比,把每个工具的特性和适用场景拆开来说。
核心命令:scp、rsync、sftp分别怎么用
这三个命令是Linux下跨服务器拷贝的标配,但各自的设计思路不同,先搞清楚它们的基本用法,你才能根据实际场景快速选择。
scp:简单直接的安全拷贝
scp(Secure Copy)基于SSH协议,语法和cp非常相似,适合临时、一次性的文件传输,它的优势是零配置,只要SSH连通就能用。
拷贝单个文件到远程服务器:
scp /local/file.txt user@remote_ip:/remote/directory/
从远程服务器下载到本地:
scp user@remote_ip:/remote/file.txt /local/directory/
拷贝整个目录(加-r参数):
scp -r /local/dir user@remote_ip:/remote/dir
几个实用参数:
-P指定端口(大写P,如果SSH端口不是默认22)-C启用压缩(传输文本文件时效果明显)-l限制带宽(单位Kbit/s,比如-l 1000限制1Mbps)
scp最大的问题是传输大文件或大量小文件时,如果网络中断,必须从头重传,而且它不支持增量同步,每次都是全量拷贝。
rsync:增量同步的首选
rsync可以说是scp的进阶版,核心优势是只传输差异部分,并且支持断点续传,对于需要定期同步的目录,rsync几乎是最优解。
本地到远程同步:
rsync -avz /local/dir/ user@remote_ip:/remote/dir/
远程到本地同步:
rsync -avz user@remote_ip:/remote/dir/ /local/dir/
参数解释:
-a归档模式,保留权限、时间戳等属性-v显示详细信息-z传输时压缩数据--progress显示进度条--partial保留部分传输的文件,实现断点续传
举个例子,如果你每天凌晨同步一次日志目录,rsync只拉取新增或修改的文件,第一次全量后后续速度极快,业内专家指出,在涉及大量小文件的场景下,rsync的增量传输效率比scp高出数倍。
sftp:交互式文件传输
sftp同样是SSH套件的一部分,它不提供命令行式的一键拷贝,而是通过交互式会话操作,适合需要查看远程目录结构、选择性下载的场景。
连接远程服务器:
sftp user@remote_ip
进入sftp环境后,常用命令:
ls列出远程文件lls列出本地文件get remote_file下载文件到本地put local_file上传文件到远程get -r dir递归下载目录exit退出
sftp的优点是安全可控,但缺点也很明显:无法后台运行,不能断点续传(部分客户端支持,但原生sftp不支持),且交互式操作不适合自动化脚本。
实操场景:从远程服务器拷贝文件到本地
这里我直接给出三种常见场景的完整操作步骤,你照着做就能跑通。
快速拉取一个配置文件
假设你需要在本地编辑远程服务器上的/etc/nginx/nginx.conf,然后用scp一次性拉下来:
scp root@192.168.1.100:/etc/nginx/nginx.conf ./nginx.conf.bak
编辑完再上传回去:
scp ./nginx.conf.bak root@192.168.1.100:/etc/nginx/nginx.conf
同步整个网站目录到本地备份
如果网站目录有几十万个小文件,scp显然不合适,用rsync更靠谱:
rsync -avz --delete --progress root@192.168.1.100:/var/www/html/ /backup/www/
--delete参数会删除本地有而远程已经删除的文件,保持两边完全一致,第一次同步可能慢,但后续只更新修改过的文件,速度飞快。
交互式下载特定文件
如果你不确定远程目录下有哪些文件,或者只想挑几个文件下载,sftp更直观:
sftp root@192.168.1.100 cd /var/log ls -la get nginx/access.log ./logs/ exit
scp和rsync哪个更适合跨服务器拷贝
这个对照表能帮你快速决策:
| 对比维度 | scp | rsync |
|---|---|---|
| 传输方式 | 全量拷贝 | 增量同步(只传差异部分) |
| 断点续传 | 不支持 | 支持(加--partial) |
| 压缩传输 | 支持(-C) |
支持(-z) |
| 保留文件属性 | 有限(部分参数) | 完整(-a保留权限、时间戳等) |
| 传输速度 | 全量重传,大文件慢 | 增量高效,小文件优势明显 |
| 使用难度 | 简单,语法类似cp | 参数较多,学习曲线略高 |
选择建议:
- 如果只是偶尔传一两个小文件(几MB以内),scp完全够用,没必装rsync。
- 如果需要定期同步目录、备份数据,或者文件很大、网络不稳定,rsync是更聪明的选择。
- 如果远程服务器没有rsync服务端(多数Linux发行版默认已安装,但极简镜像可能没有),scp是兜底方案。
关于安全性: 两者都基于SSH协议,传输过程加密,安全性没有本质区别。
linux服务器之间传输文件用什么工具
很多人在初次接触时总在问“linux服务器之间传输文件用什么工具”,其实答案取决于你的具体场景,没有绝对的好坏,下面我按常见需求分类推荐。
基于网络环境的选择
- 内网高速传输: 如果服务器在同一机房,带宽充足,scp和rsync速度差异不大,但rsync的增量特性依然有优势,特别是文件数量多时。
- 公网低带宽高延迟: 强烈推荐rsync,因为它的压缩和增量传输能显著减少数据量,如果网络不稳定,加上
--partial和--progress,中断后可以续传。 - 防火墙限制严格: 只开放了SSH端口(22),scp、rsync、sftp都能用,因为它们都基于SSH,如果连SSH都没有,可以临时开一个HTTP或FTP,但安全性差很多,不建议。
不同工具的典型场景
- 运维自动化脚本: 用rsync,因为它参数丰富,支持排除文件、删除匹配、限定带宽等,可以很好地融入
cron定时任务。 - 临时传文件给同事: scp最方便,一行命令搞定,不需要考虑属性保留。
- 需要双向同步: 可以考虑使用
unison,但多数情况下rsync配合--delete和反向同步就够用了。
价格”和“地域”的考虑
这里说的“价格”不是工具本身,而是传输成本,如果你在云服务商之间传输数据,比如从简米云ECS拷贝到酷番云CVM,公网流量会收费,统计显示,跨地域传输流量费用可能占整体成本的相当比例。先压缩再传输、尽量在非高峰时段运行,以及使用rsync的增量同步减少重复数据,都能有效降低开销。
至于“地域”影响,不同机房之间的延迟和丢包率差异较大,比如从北京机房同步到广州机房,建议使用rsync的--bwlimit限制带宽,避免占满带宽导致其他业务受影响。分批次传输比一次性全量更稳妥。
提升传输速度的实用技巧
无论你用scp还是rsync,下面几个技巧都能帮你明显提速,尤其是大文件或海量小文件场景。
开启压缩传输
对于文本文件(日志、配置、代码),压缩效果立竿见影。
- scp:
scp -C source dest - rsync:
rsync -z source dest
统计表明,文本类文件压缩后体积能缩小50%以上,传输时间几乎减半,但对于已经压缩过的文件(如zip、jpg、mp4),压缩参数反而会浪费CPU资源,不建议开启。
限制带宽,避免影响业务
在内网或公网传输时,如果不想让拷贝任务占满带宽,可以限制速率。
- scp:
scp -l 10000(单位Kbit/s,即约1MB/s) - rsync:
rsync --bwlimit=10000(单位KB/s,即约10MB/s)
注意单位不同,scp是Kbit,rsync是KB,建议在非业务高峰期执行,或者设置合理的限速值。
使用rsync的断点续传和部分传输
大文件传输时,网络中断是常事,rsync的--partial选项会保留已传输的部分,下次同步时只传剩余部分,搭配--progress可以实时查看进度。
rsync -avz --partial --progress user@remote:/bigfile.iso /local/
如果中断后重新运行同样的命令,rsync会自动识别已存在的部分并续传。
调整SSH加密算法
SSH默认的加密算法(如aes128-ctr)速度足够快,但在老旧服务器上,可以尝试更快的算法,比如chacha20-poly1305,不过这个改动需要两端都支持,且安全性会略有降低,大多数情况下不需要调整。
常见问题与解答
Q1:linux跨服务器拷贝文件命令有哪些?
主要有三个:scp、rsync和sftp,scp适合一次性全量传输,rsync适合增量同步和断点续传,sftp用于交互式浏览和下载,还有curl和wget配合HTTP/HTTPS也可以用,但需要远程服务器上有Web服务,对于大多数运维场景,scp和rsync已经覆盖了90%的需求。
Q2:scp传输速度慢怎么解决?
先检查网络带宽是否饱和,如果带宽充足但还是慢,可能是加密协议开销大,尝试加-C压缩参数传输文本文件,或者改用rsync加-z,压缩效率更高,如果文件特别大,可以考虑分片传输,或者使用tar先打包再压缩,减少文件数量,降低SSH握手次数,确认SSH是否配置了Compression yes,但默认通常已开启。
Q3:如何自动同步两个服务器之间的文件?
使用rsync配合cron定时任务是最常见的方案,例如每天早上3点同步日志目录,可以在/etc/crontab中添加一行:
0 3 root /usr/bin/rsync -avz --delete root@192.168.1.100:/var/log/ /backup/logs/
对于更复杂的双向同步,可以考虑lsyncd,它基于inotify监控文件变动并实时触发rsync同步,多数情况下单向rsync配合cron已经足够。
无论你选择scp、rsync还是sftp,核心原则是根据文件大小、网络条件和使用频率来定。 一次性小文件用scp,定期大批量同步用rsync,需要交互浏览时用sftp,掌握这三个命令,绝大多数跨服务器文件拷贝需求都能轻松应对。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/592271.html




