把另一台服务器上的数据“拿过来”,最直接的办法就是用scp命令,一条指令就能把远程文件拉到本地,或者把本地文件推送到远程。会围绕服务器文件转移这个高频场景,把不同工具、不同网络环境下的操作方法讲透。
服务器之间传文件,先分清两个核心场景
很多朋友一上来就问“怎么导出”,其实在真实的运维工作里,“导出”这个词对应的操作不太一样,你要先想清楚自己属于哪种情况,才能选对工具。
- 把远程服务器的文件拉到本地电脑,比如你想把服务器上的网站备份、日志文件、数据库备份下载到自己笔记本上,这种操作,
scp和sftp最顺手。 - 两台服务器之间直接互传文件,比如从旧的简米云服务器迁移到新的酷番云服务器,中间不经过本地电脑,这种场景,
rsync搭配ssh的效率比scp高很多,尤其是数据量大的时候。
行业共识认为,90%以上的服务器迁移需求,其实都是第二种情况,如果你只是偶尔传一两个小文件,scp足够用了;但如果你要同步整个网站目录或者数据库备份,那rsync才是主力。
用scp快速拉取远程服务器文件
scp是OpenSSH套件自带的命令,只要你能用ssh登录服务器,就一定能用scp传文件,不需要额外安装任何东西。
从远程服务器导出文件到本地
最基础的用法是这样:
scp 用户名@服务器IP:/服务器上的绝对路径 /本地保存的路径
举个例子,你想把服务器上/home/wwwroot目录下的backup.tar.gz文件,下载到自己电脑的~/Downloads文件夹里:
scp root@192.168.1.100:/home/wwwroot/backup.tar.gz ~/Downloads/
执行之后,系统会提示你输入服务器密码,输完密码,文件就开始传输了,如果服务器端口不是默认的22,需要加-P参数指定端口(注意是大写的P):
scp -P 2222 root@192.168.1.100:/home/wwwroot/backup.tar.gz ~/Downloads/
把本地文件推送到远程服务器
反过来操作也顺理成章,把本地路径写在前面,远程路径写在后面:
scp ~/Downloads/website.zip root@192.168.1.100:/home/wwwroot/
这条命令会把本地website.zip上传到服务器的/home/wwwroot目录下,如果你有多个文件要传,可以用scp file1 file2 用户名@IP:目标路径。
导出整个目录的办法
scp拉取整个目录需要加-r参数(recursive,递归复制):
scp -r root@192.168.1.100:/home/wwwroot /home/本地备份目录/
注意,scp -r会把目录原封不动地复制下来,不过这里要提醒一句,如果目录下文件特别多,达到了上万个文件,scp的处理速度会比较慢,这种情况建议改用下面说的rsync。
限速与断点续传需求
scp有一个明显的短板:不能断点续传,万一传了一半网络断了,就得从头再来,另外它也没办法限制带宽,如果你在公司和同事共用网络,大文件传输可能会把带宽占满。
针对这个痛点,下文讨论的rsync就是更好的选择,业内专家指出,生产环境中大规模数据迁移,几乎不会有人用scp,大家都是用rsync配合计划任务来做。
用rsync实现高效linux服务器数据迁移
rsync是Linux服务器数据迁移场景下的王牌工具,它最强大的地方在于增量同步:第一次全量传完,第二次再跑同样的命令,只会传发生变化的那部分文件,用时大大缩短。
rsync在另一台服务器之间怎么用
在两个服务器之间用rsync,基本语法是:
rsync -avz --progress /本地目录/ 用户名@服务器IP:/目标目录/
这里的参数含义:
-a:归档模式,保留文件权限、所有者、时间戳等属性。-v:显示详情。-z:传输时压缩,适合文本类文件,能节省带宽。--progress:显示传输进度。
把本机/home/wwwroot/整个目录同步到远程服务器的/backup/wwwroot/下:
rsync -avz --progress /home/wwwroot/ root@192.168.1.100:/backup/wwwroot/
注意源目录后面那个斜杠要保留,它表示“把目录里的内容同步过去”,而不是“把目录本身也复制过去并包一层”,如果漏掉斜杠,远程目录下会多出一个嵌套的同名文件夹。
从远程服务器拉取文件
rsync和scp一样可以做“拉”操作,只是把源和目标调换位置:
rsync -avz --progress root@192.168.1.100:/home/wwwroot/ /backup/wwwroot/
断点续传和限速
rsync天然支持断点续传,如果传输中断,只要把相同的命令再跑一遍,它会自动从上次中断的地方继续,不会重复传输已完成的块。
如果你想限制带宽,避免影响服务器上的其他业务,用--bwlimit参数:
rsync -avz --bwlimit=5000 root@192.168.1.100:/home/wwwroot/ /backup/wwwroot/
这里的5000表示每秒最多传输5000KB,也就是大约5MB/s的带宽,根据你服务器实际的带宽大小,可以灵活调整。
删除远程多余文件
有一种特殊需求:你想让远程目录和本地目录完全保持一致,本地删掉的文件,远程也要同步删掉,这时候用--delete参数:
rsync -avz --delete /home/wwwroot/ root@192.168.1.100:/backup/wwwroot/
这个参数要小心用,它会删除远程目录里所有本地不存在的文件,一旦路径写错,可能把远程服务器上的数据删光,强烈建议先在测试目录里试跑一遍。
导出服务器数据库汇总备份
除了文件,服务器上最常见的数据就是数据库,导出MySQL或MariaDB数据库,用的不是scp,而是mysqldump工具。
先导出数据库为文件
在服务器上执行:
mysqldump -u 用户名 -p 数据库名 > /home/database_backup.sql
输入密码后,数据库内容会被导出成一个.sql文件,如果需要同时导出多个数据库,用--all-databases参数:
mysqldump -u root -p --all-databases > /home/all_databases.sql
再把sql文件传走
拿到.sql文件后,你就可以用上面讲的scp或rsync把它传到另一台服务器了,实际操作中,很多人习惯把导出和传输连起来,用管道符一步完成:
mysqldump -u root -p 数据库名 | ssh root@192.168.1.100 "cat > /backup/database.sql"
这条命令在服务器上直接导出数据库,并通过ssh写到远程服务器上,好处是本地不用产生临时文件,省磁盘空间,传输效率也更高。
绕过数据传输的通用方案:打包后导出
当你要导出的东西比较复杂,比如一个包含大量小文件的目录,直接传输小文件的开销会很大,Linux服务器之间传小文件,每一秒都在建立新的连接,速度慢且容易打断。
建议先打包再传输
先打个比方:把10000个文件挨个传,不如先塞进一个行李箱再运走,所以常规思路是先在服务器上打包压缩:
tar -czvf website_backup.tar.gz /home/wwwroot/
然后把这个.tar.gz文件用scp或rsync传到另一台服务器,到了目标服务器后解压:
tar -xzvf website_backup.tar.gz -C /目标目录/
这样做的好处是:
- 文件数量大幅减少,传输稳定。
- 压缩后体积变小,节省带宽和时间。
- 打包时保留完整权限结构,恢复时不容易出错。
tar加ssh的进阶操作
如果不想在源服务器上留压缩包,可以用tar搭配ssh实现流式传输:
tar -czvf - /home/wwwroot | ssh root@192.168.1.100 "tar -xzvf - -C /backup/"
这条命令把/home/wwwroot目录打包压缩后,直接通过ssh管道送到远程服务器并解压,整个过程不在本机产生文件,双服务器单命令搞定迁移,日常运维中这个技巧非常实用,值得记下来。
传输完成后一定要校验一致性
不要以为文件传过去就万事大吉了,网络上传输数据,有可能因为网络拥塞或其他原因造成文件损坏,校验这一步能从源头避免后续排错的麻烦。
用md5sum做简单校验
在两台服务器上分别执行:
md5sum website_backup.tar.gz
对比两边输出的哈希值,完全一致就说明文件完好,如果哈希值不一致,说明源文件或传输环节有问题,需要重新传输。
用rsync的校验机制
rsync本身在传输过程中会做校验,但它在特定场景下容易出现“只判断文件大小和修改时间就跳过传输”的情况,如果你希望确保内容完全一致,可以加-c参数:
rsync -avzc root@192.168.1.100:/home/wwwroot/ /backup/wwwroot/
-c会强制rsync在文件大小和时间相同的情况下,再计算校验和来确认内容是否一致,相比之下,scp没有这个机制,这也是生产环境更倾向用rsync的原因之一。
服务器端口和防火墙不通怎么办
有时候不是命令问题,而是网络本身就不通,遇到这种情况,按以下顺序排查:
- 先确认两台服务器是否能互相
ping通。ping不通,后面的命令大概率都执行不了。 - 检查
ssh服务是否在运行,执行systemctl status sshd查看状态,没启动就执行systemctl start sshd。 - 确认防火墙端口是否放行。
ssh默认走22端口,如果服务器启用了防火墙,需要执行firewall-cmd --add-port=22/tcp --permanent并重载防火墙。 - 云服务商的安全组规则,简米云、酷番云等平台都有安全组,相当于第二层防火墙,在控制台确认入方向规则是否放行22端口(或你指定的其他端口)。
常见问题答疑
问:scp和rsync在linux服务器之间传输文件,究竟哪个更好用?
如果只是偶尔传一两个小文件,scp更简单直观,但如果是整个网站目录迁移、数据同步这类需要长期重复执行的场景,rsync明显更强,它能断点续传、增量同步、限速控制,而且传输多个小文件时效率远高于scp,从多数实际运维案例来看,rsync在数据迁移这件事上是首选。
问:如何判断文件到底传完整了没有?
传到远程服务器后,在两端分别执行md5sum或sha1sum对比哈希值,这是最稳妥的方法,如果你用的是rsync -c参数,它在传输过程中就会自动对比校验和,不需要额外手动校验。rsync结束时的传输统计信息里会明确显示传输速率、字节数以及是否有异常中断,看到sent和received字节数不等于0且日志里没有error字样,基本就能确认传输成功。
问:远程端口改成了2222怎么办?
用scp时加-P 2222(大写P),用rsync时则是使用-e "ssh -p 2222"来指定端口。rsync默认走ssh通道,所以可以通过-e参数把自定义端口传给它。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/787514.html


