Linux文件传到另一台服务器,最稳妥直白的方式就是用scp命令,但具体场景下rsync、sftp、tar管道各有优势,选错工具会白白浪费时间。本文按实际运维场景拆解每种方案的适用条件,直接给出可验证的实操命令。
Linux传文件到另一台服务器:先分清临时传输还是长期同步
很多新手一上来就纠结工具,其实核心只有两个问题:传一次就走,还是以后每次增量更新,临时传文件用scp,三行命令搞定,如果是网站日志、备份数据这种需要反复同步的场景,必须用rsync,这两者的区别决定了你后续维护成本的高低。
scp命令一行搞定单文件传输
scp(Secure Copy)基于SSH协议,语法和cp几乎一样,只是多了主机信息,比如把本机/home/user/backup.sql传到168.1.100服务器的/data目录:
scp /home/user/backup.sql root@192.168.1.100:/data/
反向下载同理:
scp root@192.168.1.100:/data/backup.sql /home/user/
常用参数记住三个就够了:-P指定端口(大写P,SSH默认22不用加),-r递归复制整个目录,-C开启压缩传输加快速度,举个例子,传整个nginx配置目录到备份服务器:
scp -r -C /etc/nginx root@10.0.0.5:/backup/nginx_conf/
业内专家指出,scp在OpenSSH 9.0之后的版本中已标记为弃用,未来会被sftp协议替代,但现阶段绝大多数服务器仍可正常使用。
rsync增量同步才是大文件传输的正确姿势
传一个2GB的数据库备份文件,scp每次都要全量拷一遍,rsync却只传变化的部分,断点续传、权限保留、排除指定目录这些功能都是scp没有的。
基本用法:
rsync -avz /home/user/data/ root@192.168.1.100:/data/
参数拆解:-a归档模式保留权限和时间戳,-v显示详细过程,-z传输时压缩。注意源路径末尾的斜杠:/data/表示复制目录内的所有内容,/data表示复制目录本身,这个细节搞反了,目标服务器上会多套一层目录。
rsync断点续传和大文件场景
传输中途断了,重新执行一遍相同命令,rsync会自动对比两端文件差异只补传剩余部分,加
--partial参数可以保留已传输的临时文件,进一步加快续传速度。
rsync -avz --partial /home/user/bigfile.tar.gz root@192.168.1.100:/data/
排除不需要的目录
同步网站目录时,/tmp和/cache这类临时文件没必要传,用--exclude指定:
rsync -avz --exclude='tmp' --exclude='cache' /var/www/ root@192.168.1.100:/var/www/
Linux服务器之间传大文件用什么命令更快?
这个问题在百度被搜索的频率相当高,答案不是scp也不是rsync,而是tar管道直连,它不落盘直接流式传输,适合超大文件或大量小文件场景:
tar czf - /home/user/data | ssh root@192.168.1.100 "tar xzf - -C /data/"
这条命令把本机data目录打包压缩后直接推到远端解压,不经过中间文件,比scp快在两点:压缩减少网络传输量、省去磁盘写入读取的额外开销。
Linux文件传输工具的横向对比:场景决定选择
很多用户分不清ftp、sftp、scp、rsync之间的关系,其实它们归属不同协议栈,下表对比最常用的几类:
| 工具 | 协议 | 增量传输 | 断点续传 | 交互式操作 | 适合场景 |
|---|---|---|---|---|---|
| scp | SSH | 不支持 | 不支持 | 不支持 | 快速传单个文件 |
| rsync | SSH(默认) | 支持 | 支持 | 不支持 | 周期性同步目录 |
| sftp | SSH | 不支持 | 支持 | 支持 | 交互式浏览下载 |
| lrzsz | ZMODEM | 不支持 | 不支持 | 支持 | 小文件终端直传 |
sftp交互式传输适合临时查看远端目录
sftp是SSH自带的文件传输组件,无需额外安装,登录后像FTP一样操作:
sftp root@192.168.1.100
进入交互界面后,ls查看远端文件,get下载,put上传,它的价值在于先看看对方服务器有什么文件再决定传哪个,避免scp一把梭传错文件,国内云服务器厂商(如简米云、酷番云)的轻量应用服务器默认开启sftp服务,用
put命令即可完成上传:
sftp> put /home/user/backup.tar.gz /data/
大目录迁移首选tar加rsync组合
目录里有几十万个文件,直接rsync会因逐文件比对元数据而变慢,行业共识是先tar打包再rsync,分两步走:
tar czf /tmp/data_full.tar.gz /home/user/data/ rsync -avz --progress /tmp/data_full.tar.gz root@192.168.1.100:/data/
文件数量极大时,打包后传输速度能提升数倍,代价是需要本机临时磁盘空间存放打包文件,磁盘不够就别用这招。
Linux文件传到另一台服务器没权限怎么办?
实际运维中遇到最多的报错是Permission denied,这通常不是技术问题而是权限设计,排查顺序:
- 确认目标目录写权限:远端目录属主是否为当前登录用户,
ls -ld /data查看 - 确认SSH登录权限:
sshd_config中是否允许root登录,PermitRootLogin yes改为prohibit-password更安全 - 确认防火墙或安全组:云服务器需要在控制台放行来自源IP的22端口
SSH密钥配置免密传输
手动输密码传一次两次还行,做定时同步就得配密钥,在本机生成密钥对:
ssh-keygen -t rsa -b 4096
公钥复制到目标服务器:
ssh-copy-id root@192.168.1.100
之后所有scp、rsync命令都不需要再输密码。密钥比密码安全得多,密码有暴力破解风险,密钥对不存在这种问题,运维人员做定时备份时,这步是必须完成的。
Linux不同服务器之间传文件的操作细节与坑
端口非22时的传输写法
有些服务器为了安全改了SSH端口,scp用-P,rsync用-e参数:
scp -P 2222 /home/user/file.txt root@192.168.1.100:/data/ rsync -avz -e "ssh -p 2222" /home/user/file.txt root@192.168.1.100:/data/
Windows和Linux跨平台传输
本地是Windows,远端是Linux,用WinSCP这个工具最省事,图形化界面拖拽即可,它自带同步功能,支持SFTP、SCP、FTP三种协议,下载地址在官网就有,传输大文件时勾选”后台传输”,断线后可以续传。
断网中断后如何续传
网络不稳定导致传输中断,rsync重新执行原命令可以实现断点续传,scp则做不到,只能重头再来。这也是生产环境推荐rsync的核心原因,如果用的rsync传输中断后再次执行没反应,检查目标临时文件后缀,rsync默认把未完成部分存成.文件名.xxxxxx,下次执行自动拼接。
Linux传输文件安全加固建议
文件能传到服务器上,反向意味着服务器文件也可能被传出去。安全基线需要守住三点:
- 禁用密码登录,只保留密钥认证
- 限制SFTP用户只能访问指定目录(
ChrootDirectory设置) - 传输完即时清理上传的临时压缩包
据工信部发布的网络安全威胁信息,近年针对SSH端口的暴力破解攻击呈现持续增长态势。用密钥代替密码、改掉默认22端口、配置Fail2ban自动封禁,这三板斧能挡住绝大多数自动化攻击。
Linux文件传到另一个服务器:完整决策路径
最终判断逻辑整理成清单,照着选就行:
- 传一个文件,不需要交互 → scp
- 定期同步目录,增量备份 → rsync
- 想先看看对方目录再决定传什么 → sftp
- 文件巨多且本机磁盘够大 → tar + rsync
- Windows传到Linux → WinSCP
- 临时共享给多人下载 → python3 -m http.server
所有方案中rsync是适用面最广的,兼顾速度和稳定性,但不要盲目照搬命令,根据实际情况调整路径、端口、参数。
常见问题解答
Linux文件传到另一台服务器后权限变了怎么办?
scp传输会保留源文件的权限位,但属主和属组会变成目标服务器的当前登录用户,如果需要精确还原属主属组,用rsync的-a参数并在目标机器上以root身份执行,归档模式下-o和-g选项会同步属主和属组信息。
Linux传大文件到服务器速度很慢怎么提速?
先排查是否是带宽瓶颈,用iperf3测两端网络吞吐量,网络没问题就加压缩参数:scp加-C,rsync加-z,文件本身是压缩包(zip、tar.gz)就别再加压缩参数了,CPU开销大且体积降不了多少,反而更慢,大量小文件场景优先tar打包后再传。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/694869.html





