在两台Linux服务器之间发送文件夹,最稳妥高效的办法是使用rsync命令,它支持增量传输、断点续传和限速,兼顾速度与安全;如果只是临时传一次,scp命令更简单直接,一行代码解决问题。
很多运维新手第一次遇到这个问题时,往往会上传压缩包再到目标服务器解压,绕了远路,其实Linux内置的工具链足够强大,关键在于选对场景、写好参数,往下看具体怎么操作。
最直接的传输方式:scp命令逐字拷贝
scp(secure copy)基于SSH协议传输,不需要额外安装服务端,只要两台服务器都开了SSH就能用,它的特点是全量复制,简单粗暴,适合一次性、文件量不大的场景。
基础语法:
scp -r /本地目录路径 用户名@目标IP:/目标目录路径
-r参数表示递归拷贝整个目录,不加会报错,举个例子,把本机/data/www这个文件夹发到192.168.1.10服务器的/backup目录下:
scp -r /data/www root@192.168.1.10:/backup
输入root密码后就开始传输,若目标端口不是默认的22,用-P(大写)指定端口:
scp -r -P 2222 /data/www root@192.168.1.10:/backup
大文件传一半断了怎么办?scp不支持断点续传,只能重来,这也是为何rsync更受欢迎的原因。
大文件夹批量同步:rsync才是生产力工具
行业共识认为,rsync是Linux服务器之间同步文件的首选方案,它比scp聪明的地方在于增量对比第一次全量传,第二次只传变化的文件,节省时间和带宽,对动辄几十GB的站点目录来说,这个特性非常关键。
常用组合:
rsync -avz /本地目录路径 用户名@目标IP:/目标目录路径
-a表示归档模式(保留权限、时间戳、软链接),-v显示进度,-z传输时压缩,加上–progress可以看每个文件的传输百分比:
rsync -avz --progress /data/www root@192.168.1.10:/backup
目录结尾的斜杠有讲究。
rsync -avz /data/www 会把www文件夹本身传过去,目标端变成/backup/www;写成/data/www/则只传www里的内容到/backup下。多数情况下建议带斜杠,避免多嵌套一层目录。
断点续传加上–partial参数:
rsync -avz --partial --progress /data/www root@192.168.1.10:/backup
即使网络中断,已传文件不会丢弃,重跑命令会接着传。
转发场景:两台服务器传输文件速度太慢怎么办
两台跨地域的服务器传文件,延迟高、丢包多,速度经常只有几十KB/s。最有效的提速手段是压缩传输和并行传输。
rsync的-z参数开启压缩,对文本类文件(日志、代码、JSON)提速明显,但对已压缩的图片、视频反而增加CPU开销,更激进的方案是用tar配合SSH管道,释放所有网卡带宽:
tar czf - /data/www | ssh root@192.168.1.10 "tar xzf - -C /backup"
这条命令把本机/data/www打包并通过SSH直接写到目标服务器的/backup下,中间不生成临时文件。实测在千兆内网中,这种管道方式比scp快30%以上,因为tar的打包效率比scp逐文件读写高得多。
若是内网传输,先检查网卡是否跑在千兆模式:
ethtool eth0 | grep Speed
如果显示100Mb/s,插根千兆网线比调参数实在,跨公网传输则优先考虑rsync加限速,避免占满带宽影响业务:
rsync -avz --bwlimit=2000 /data/www root@192.168.1.10:/backup
–bwlimit单位是KB/s,上面表示限速2MB/s。
两台Linux定时同步文件夹:自动化替代手动
生产环境经常需要每天备份日志或定期同步配置,用crontab配合rsync,一条命令就能实现无人值守。
先测试同步命令没问题,再写入cron,创建脚本文件/usr/local/bin/sync_www.sh:
#!/bin/bash rsync -avz --delete /data/www root@192.168.1.10:/backup
–delete参数很关键,它会让目标端删除本地已不存在的文件,保证两边完全一致,不加则只增不删,容易积累垃圾文件。
赋予执行权限:
chmod +x /usr/local/bin/sync_www.sh
添加定时任务:
crontab -e
写入:
0 2 /usr/local/bin/sync_www.sh >> /var/log/sync_www.log 2>&1
表示每天凌晨2点执行一次,定时任务在两台Linux服务器之间定时同步文件这个场景下,能彻底解放双手,判断任务是否成功,直接看日志:
tail -20 /var/log/sync_www.log
如果是SSH密钥认证,rsync这条命令不需要交互,非交互执行的关键在于先配置免密登录:
ssh-keygen -t rsa -N "" ssh-copy-id root@192.168.1.10
第一次输入密码后,后续连接全免密,这是自动化任务的前提。
安全性考虑:生产环境传输别裸奔
把敏感数据直接扔到公网上传,有一定风险。两台服务器传输文件用什么工具不推荐明文协议,比如FTP、telnet这种老古董。
scp和rsync都走SSH加密通道,数据在传输过程中不可被窃听,如果传输的是数据库备份、用户隐私、密钥文件,建议在rsync命令中加上SSH参数强制走高强度加密算法:
rsync -avz -e "ssh -c aes256-gcm@openssh.com" /data/www root@192.168.1.10:/backup
或者用sftp代替scp,支持断点续传且更灵活,sftp类似于交互式FTP,但加密通道和scp一致:
sftp root@192.168.1.10 put -r /data/www /backup
如果目标服务器只允许内网访问,最好通过跳板机(堡垒机)中转,在有跳板机的场景下,用ProxyJump参数穿透:
scp -o ProxyJump=跳板机用户@跳板机IP -r /data/www root@目标IP:/backup
这样本机不直接暴露在公网,攻击面更小。
传输大文件时的几项常规错误排查
Permission denied(公钥),大概率是用了密钥认证,但目标服务器上的authorized_keys没配好,检查目标机~/.ssh/authorized_keys是否存在,权限是否为600。
连接超时,可能被防火墙拦了,先ping通不通,再检查目标端口:
telnet 192.168.1.10 22
不通则去安全组或iptables放行22端口。
磁盘写满,传输中断后最容易被忽略的原因,用df -h看目标机磁盘剩余空间,不足时清理日志或换挂载点。
rsync传输后文件权限变了,这种情况多为-u参数没加导致无法保留属主信息,注意使用-a参数而非-r。
Q&A:Linux服务器之间怎么发文件夹相关高频疑问
Linux服务器之间传输文件,用scp还是rsync好?
取决于用途,一次性传小文件用scp,命令短、无学习成本,定时同步、大目录增量同步、断点续传,用rsync,rsync功能更强但参数多,scp胜在简单,日常运维两样都值得掌握。
两台linux服务器同步文件夹,有没有图形化界面可以用?
服务器通常不装桌面,命令行是主流,如果实在需要图形界面,可以本机用FileZilla(支持SFTP协议)连接服务器,拖拽上传,但这种方式需要先下载到个人电脑再上传,中间多一道网络传输,适合少量文件,不适合服务器间直传。
局域网内两台Linux服务器传文件夹,跑不满千兆网速怎么解决?
先排除网卡协商速率问题,ethtool查看双工模式,然后用iperf3测两端实际带宽,跑不到900Mb/s以上基本是网线或交换机问题,排除网络瓶颈后,用tar管道传输替代scp,能显著提高吞吐量,多小文件的场景下,先tar再传效率反而更高,因为避免了每个文件单独建连接的开销。
传完文件夹后,怎么确认两台服务器内容完全一致?
在目标端执行:
diff -r /backup/www /data/www -q
没有输出说明一致,大目录对比耗时较长,更快的做法是通过rsync二次运行,如果没有文件被传输,说明两边已经完全同步。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/732875.html




