1. 为什么要把scp、rsync、inotify+rsync放一起讲
聊这个话题的起因,是我之前帮一个朋友迁移服务器。那台机器跑了好几年,上面有几十个G的站点资源、日志和备份文件。他最开始用scp往新机器上拷,拷到一半卡住了,进度条半天不动,最后Ctrl+C放弃,跑来问我有没有更快更稳的办法。我说你早该换rsync的,rsync十分钟能搞定的事,scp可能得折腾一个小时还不一定成功。他当时将信将疑,直到我用rsync把整个目录同步过去,还顺手做了个断点续传给他看,他才真正理解两者之间的差距。
其实这背后是一个完整的文件传输与同步的进阶链路:scp解决的是“临时往远程拷个文件”的场景,简单直接但效率一般;rsync解决的是“大规模、增量、可靠地同步目录”的场景,是运维和开发手里最常用的远程同步利器;而inotify+rsync则更进一步,把“定时同步”变成了“事件触发、秒级同步”,做到文件一改动就自动推到远端。很多Linux教程把这几个工具拆成零散的知识点,但实际工作中它们是递进关系,越往后越接近生产环境的真实需求。
这篇文章我会以实际可复现的方式,把这四个环节全部过一遍:scp的日常用法和容易踩的坑,源码编译安装rsync的完整过程和编译环境常见报错,rsync的增量同步原理和生产级参数怎么组合,最后是inotify+rsync的实时同步脚本、守护方式以及生产环境里的取舍。适合已经掌握Linux基础命令、想往系统运维或后端部署方向深入的同学,也适合需要经常在服务器之间搬数据的开发人员参考。
之所以把源码编译安装单独拎出来一章,是因为rsync在不同发行版上的预装版本新老不一,有些老系统自带的rsync版本太低,很多高级参数不支持,这时候就需要自己动手编译一个新版本出来。学会了rsync的编译安装,以后编译安装Python、nginx、其它开源软件,思路是完全相通的。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. scp远程拷贝:日常用法与绕不开的几个坑
2.1 scp的基本形态:三种传输方向
scp全称是Secure Copy,基于SSH协议加密传输,语法非常贴近cp,只不过多了一个“远端主机”的概念。最简单的用法有三种方向。
第一种,本机拷到远端:
bash复制scp /home/user/test.txt user@192.168.1.100:/data/
第二种,远端拷回本机:
bash复制scp user@192.168.1.100:/data/test.txt /home/user/
第三种,远端到远端。注意,这种方式的流量会先经过本地中转,不是两台远端机器直连:
bash复制scp user1@host1:/data/file user2@host2:/tmp/
拷目录要加-r:
bash复制scp -r /home/user/project user@192.168.1.100:/data/
指定端口用大写-P,比如SSH跑在22022端口:
bash复制scp -P 22022 /home/user/test.txt user@192.168.1.100:/data/
提示:scp的端口参数是大写
-P,而普通ssh命令的端口参数是小写-p。这个细节我见过无数人搞混,在脚本里写错后会看到“Bad port”之类的报错,排查半天才发现是大小写错了。
如果传输的是大文件且网络带宽有限,可以用-l限速,单位是Kbit/s。比如限制为1MB/s,即8192Kbit/s:
bash复制scp -l 8192 /home/user/bigfile.tar.gz user@192.168.1.100:/data/
2.2 scp实测中最容易踩的坑
scp虽然简单,但使用中有些坑非常隐蔽。
第一个坑是远程路径里的通配符。比如我想把远程目录下所有.log文件拷回来:
bash复制scp user@192.168.1.100:/data/logs/*.log /home/user/
这个*.log到底在本地展开还是在远端展开,取决于本地shell的判断。大多数情况下,冒号后面的路径不会被本地展开,会交给远端的shell去处理,但不同版本的scp/SSH对通配符的处理行为并不完全一致。我在旧版本OpenSSH上就遇到过远端通配符不自动展开的情况。保险的做法是给远程路径加引号,明确让远端shell处理:
bash复制scp 'user@192.168.1.100:/data/logs/*.log' /home/user/
第二个坑是scp不支持断点续传。传输中断后,没有--partial之类的参数,只能全部重来。大文件传输时一旦网络抖动,前面的进度就白费了。这是scp被rsync取代的最大原因之一。
第三个坑是scp对数据完整性的校验比较弱。它基于SSH加密通道,能保证传输过程不被篡改,但传输完成后没有类似rsync那样的滚动校验机制。换句话说,如果网卡或磁盘本身有问题,造成数据静默损坏,scp不太容易发现。对超大型文件,传完最好自己做一次md5或sha256校验。
第四个坑,scp -J跳板机参数。如果你需要通过跳板机转发,用-J指定跳板机地址:
bash复制scp -J jumpuser@jump_host:22 /home/user/test.txt user@192.168.1.100:/data/
很多老教程还在教-o ProxyCommand组合写法,用-J就省事多了。
2.3 什么时候应该用scp
scp适合的是“临时、少量、小文件”的场景,比如拷个配置文件、传个安装包、从服务器拉一份日志回去看。它无需额外配置,只要有SSH权限就能用,这是它最大的优势。但如果你需要同步整个目录、做定时镜像、处理几十G的数据,或者希望中断后能续传,scp就不合适了,这时候应该直接上rsync。
Windows用户如果装了WSL或新版本PowerShell,也能直接使用scp命令,这个不再像以前那么麻烦。但要注意Windows路径和Linux路径的分隔符差异,建议先在WSL或者PowerShell里用pwd确认当前路径,再执行scp。
