从一台Linux服务器把文件传到另一台服务器,最核心的命令就是scp和rsync,单文件、临时传一次用scp足够简单;目录同步、大文件、断点续传、定期备份直接上rsync更省心。
动手前先判断:你属于哪种传输场景?
很多人一上来就纠结“linux怎么把文件传到另一个服务器”,其实先分清场景,命令选择会清楚很多。
- 偶尔传一个日志文件、安装包、nginx配置文件:用scp。
- 整个网站目录、数据库备份目录要定期搬到另一台机器:用rsync。
- 每次手动输密码太麻烦,想写进脚本定时执行:先配SSH密钥免密。
- 两台机器距离远,比如国内服务器传到香港服务器:重点优化压缩和断点续传参数。
- 文件超过10GB,且网络不稳定:优先考虑rsync。
场景不同,适合的工具和参数完全不一样,下面按使用频率拆开讲。
用scp命令传输文件到远程服务器
scp的全称是secure copy,基于SSH协议工作,也就是说,只要你能ssh登录目标服务器,大概率就能用scp传文件,它走的端口和SSH一样,默认22。
基础语法看一眼就能上手
scp [参数] 源路径 目标路径
目标路径的写法是:
用户名@目标服务器IP:目标目录
比如把本机/home/ops/backup.tar.gz传到另一台服务器168.1.20的/data/backup/目录:
scp /home/ops/backup.tar.gz root@192.168.1.20:/data/backup/
回车后会提示输入目标服务器root密码,输入正确就开始传输,完成后能在目标机器对应目录看到文件。
常用参数按场景记
-P:指定SSH端口,目标服务器如果改成2222,命令要写成scp -P 2222,注意是大写P。-r:递归传输目录,传整个文件夹必须加这个参数。-C:传输时做压缩,适合文本日志、源码文件。-p:保留文件权限、修改时间等属性,注意是小写p。-q:安静模式,不打印进度信息,写在脚本里常用。
从远程服务器下载文件到本地
方向反过来即可,源路径写成远程格式:
scp root@192.168.1.20:/var/log/nginx/app.log /tmp/
这条命令会把远程nginx错误日志拉到本机/tmp/目录。
scp实操中容易踩的坑
- 目标目录没有写权限,会直接
Permission denied,先用ls -ld看权限。 - 目标端口不是22时,用了小写
会报错,因为小写p是保留属性,不是端口。-p
- 文件路径里有空格,整个路径要加引号,否则会被当成两个参数。
- 传输目录忘记加
-r,会报错提示目录是directory。
rsync和scp哪个好?大文件跨服务器传输linux更推荐rsync
这是运维圈经常讨论的问题,简单结论:单个小文件、一次性任务,scp简单直接;大文件、多文件、目录同步、增量备份,rsync更聪明。
两者核心区别对比
| 对比项 | scp | rsync |
|---|---|---|
| 传输原理 | 整体复制加密 | 增量同步,只传差异块 |
| 断点续传 | 不支持,中断后重新传 | 支持,配合--partial接上进度 |
| 目录同步 | 需要-r,简单递归 |
支持归档模式,保留更多属性 |
| 压缩能力 | -C,基础压缩 |
-z,更适合大量文本文件 |
| 适用场景 | 单个文件、一次性传输 | 大文件、目录备份、定时同步 |
| 资源占用 | 较低 | 计算差异块时会占一部分CPU |
为什么大文件场景rsync明显更强
scp是直接推整个文件,网络断开或者文件传了一半,服务器上会残留半个文件,重来得再推一遍。
rsync会先比较源文件和目标文件的差异,比如一个10GB的数据库备份文件,每天只有一小部分数据变化,rsync多数情况下只传变化的那一小块,不用重新传整个10GB,它在内部做分块校验,确认哪些内容已经存在,哪些需要更新。
rsync常用命令模板
rsync -avzP /data/site/ root@192.168.1.30:/data/site/
参数解释:
-a:归档模式,递归传输并保留权限、时间、属主、软链接等。-v:显示传输过程。-z:传输时压缩。-P:显示进度,同时支持断点续传。
如果只做增量同步,不要求保留属主等复杂属性,可以用:
rsync -rzP /data/logs/ root@192.168.1.30:/data/logs/
目录结尾斜杠有讲究
rsync -avz /data/site /backup
这条命令会在目标机器/backup下多创建一层site目录。
rsync -avz /data/site/ /backup
源目录结尾加斜杠,表示把/data/site/直接同步到/backup
下,不会多一层目录。
这个细节在同步网站根目录时特别重要,稍不注意路径层级就错了。
配置SSH密钥实现linux服务器之间传文件免密
手动输密码适合临时操作,但写定时备份脚本、做自动化发布时,每次输密码完全不可行,正确做法是配置SSH密钥认证。
配置步骤
在源服务器生成密钥对:
ssh-keygen -t ed25519 -C "file-sync-key"
一路回车即可,默认生成在~/.ssh/id_ed25519和~/.ssh/id_ed25519.pub。
把公钥复制到目标服务器:
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@目标服务器IP
输入一次目标服务器密码,公钥会追加到目标机器的~/.ssh/authorized_keys里。
测试免密登录:
ssh root@目标服务器IP
不需要密码直接登录,说明配置成功,之后再用scp或rsync,也不会再提示密码。
免密失败常见原因
- 私钥权限不对,必须是600:
chmod 600 ~/.ssh/id_ed25519
- 目标服务器
/etc/ssh/sshd_config里PubkeyAuthentication yes没有开启。 - 目标机器
~/.ssh/authorized_keys权限是777,SSH会拒绝使用。 - 复制公钥时选错了文件,把私钥内容复制过去。
国内服务器传到香港服务器怎样提速?
跨地域传输慢,通常不是scp或rsync本身的问题,而是链路延迟高、跨境带宽不稳定,这种场景下优化参数比换工具更实际。
先确认慢在哪一段
用ping看基础延迟:
ping 目标香港IP
再用mtr做路由追踪,看是哪个节点丢包或延迟飙升:
mtr -n 目标香港IP
行业共识认为,跨境链路抖动多数发生在国际出口段,命令本身能优化的部分有限,但压缩和断点续传还是能提升实际效率。
压缩再传,但要分文件类型
如果是大量文本文件、日志文件、SQL文件,开启压缩能明显减少传输量:
rsync -avzP /data/logs/ root@香港IP:/data/logs/
如果文件本身已经是.tar.gz、.zip、.jpg、.mp4这类压缩或二进制格式,就不要再开-z,否则白耗CPU,传输速度反而可能下降。
给传输任务限速,避免占满业务带宽
生产服务器带宽如果被备份任务占满,会影响正常业务请求,rsync可以限速:
rsync -avzP --bwlimit=2048 /data/backup/ root@香港IP:/data/backup/
--bwlimit=2048表示限速2048KB/s,也就是2MB/s左右,具体数值根据业务带宽调整。
大文件务必开断点续传
跨境传输大文件最怕传一半断了,rsync配合-P参数,中断后重新执行同一条命令,它会接着传已经完成的部分,不会从头开始。
传输失败怎么排查?
Linux服务器之间传文件报错,多数集中在权限、端口、磁盘、密钥四个方面。
Permission denied:目标目录写权限不足;登录用户不对;密钥没配对。Connection refused:目标服务器sshd服务没启动;防火墙没放行SSH端口。Host key verification failed:本地known_hosts里目标机器旧指纹冲突,执行ssh-keygen -R 目标IP清理后重试。No space left on device:目标磁盘满了,登录目标机器执行df -h确认。rsync: command not found:目标机器没安装rsync,Debian/Ubuntu用apt install rsync,CentOS/AlmaLinux用yum install rsync。Connection timed out:安全组或云防火墙未允许源IP访问目标端口。
大多数问题查一下目标机器日志就能定位,CentOS/AlmaLinux看/var/log/secure,Ubuntu/Debian看/var/log/auth.log,里面有明确的认证失败原因。
把scp、rsync、免密配置这三件事掌握,日常Linux服务器间传文件的需求基本都能覆盖,临时传一次用scp,目录同步和大文件用rsync,长期自动化必须配密钥。
关于linux怎么把文件传到另一个服务器的常见问题
linux怎么把文件传到另一个服务器不用密码?
先用ssh-keygen生成密钥对,再用ssh-copy-id把公钥写入目标服务器,源服务器保存私钥,目标服务器保存公钥,完成配置后,scp和rsync走密钥认证,不再要求输入密码。
大文件跨服务器传输linux用scp还是rsync?
用rsync,scp适合单个小文件,中断后需要整个重传,rsync支持增量校验和断点续传,配合-P参数,大文件中断后重新执行命令可以接着传,不用从头开始。
linux服务器之间传文件命令报错权限拒绝怎么办?
先确认目标目录属主和写权限,再检查当前登录用户是否具备对应权限,如果使用普通用户,需要sudo授权或调整目标目录权限,也可以查看目标服务器/var/log/secure或/var/log/auth.log中的认证记录,定位是密码错误、密钥拒绝还是目录权限问题。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/647150.html





