从服务器拷文件到本地:scp 与 rsync 实战

张开发
2026/5/20 15:12:08 15 分钟阅读
从服务器拷文件到本地:scp 与 rsync 实战
​ 你在服务器上跑完实验生成了一堆结果文件现在想拷到本地看看。或者服务器上有个项目目录你想整个搬下来。​ 这件事听起来简单但第一次做的时候总会卡在命令格式上。这篇文章讲三种方式scp 直接拷、先压缩再拷、rsync 增量同步从简单到高效看完就能用。一、先搞清楚一件事方向​ 不管用哪个工具核心格式都是命令 [从哪里] [到哪里]​ 从服务器拷到本地从哪里就是服务器路径到哪里就是本地路径。服务器路径的写法是用户名服务器地址:远程路径​ 比如root192.168.1.100:/home/data/results/这个格式贯穿全文记住就行。​ 三种方式都是从服务器到本地这一个方向区别只在于传输策略直接拷、压缩后拷、增量同步。二、scp最简单的拷贝​ scpSecure Copy是基于 SSH 的文件拷贝工具几乎所有 Linux/Mac 都自带不需要额外安装。2.1 拷贝用法(1) 拷贝单个文件​ 例如将服务器的/home/data/result.csv拷贝到本地当前目录。scproot192.168.1.100:/home/data/result.csv ./(2) 拷贝整个目录​ 加-rrecursive递归scp-rroot192.168.1.100:/home/data/results/ ./results/​注意远程路径末尾的/加不加都行scp 不敏感。但本地目标路径如果不存在scp 会自动创建。2.2 指定端口​ 如果服务器 SSH 不是默认的 22 端口scp-P2222-rroot192.168.1.100:/home/data/results/ ./results/​ 注意是大写-P这一点和 ssh 的小写-p不一样。2.3 scp 的局限​ scp 够用但有两个问题每次全量拷贝1000 个文件改了 2 个再 scp 还是传全部 1000 个文件多了很慢scp 是逐个文件建立传输的文件数量多时开销大即使每个文件很小。文件少的时候无所谓但目录一大就该换方案了。三、先压缩再拷文件多的时候快很多​ 当目录里有成百上千个小文件时先在服务器上打包压缩成一个文件再 scp 拉下来比直接scp -r快得多。​ 原因很直觉传 1 个 100MB 的压缩包比传 10000 个小文件快。因为省掉了逐个文件建立连接的开销而且压缩后体积更小。​ 左边逐个文件传输连接开销大、速度慢右边打包成一个文件再传一次连接搞定体积还更小。文件越多差距越明显。3.1 完整流程(1) 第一步SSH 登录服务器压缩目录sshroot192.168.1.100cd/home/datatar-czfresults.tar.gz results/​tar -czf三个参数c创建归档、z用 gzip 压缩、f指定文件名。(2) 第二步回到本地scp 拉压缩包​ 现在只有一个压缩包文件传输很快。scproot192.168.1.100:/home/data/results.tar.gz ./(3) 第三步本地解压tar-xzfresults.tar.gz​x是解压extract其他参数和压缩时一样。3.2 一条命令搞定进阶​ 不想手动登录服务器可以用 SSH 远程执行压缩再管道直接拉下来sshroot192.168.1.100tar -czf - /home/data/results/|tar-xzf--C./​ 这条命令做了三件事远程压缩 → 通过 SSH 管道传输 → 本地直接解压。中间不落地临时文件。​-czf -里的-表示输出到标准输出而不是写文件本地的tar -xzf -从标准输入读取-C ./指定解压到当前目录。3.3 压缩格式怎么选格式命令压缩率速度.tar.gztar -czf中等快最常用.tar.bz2tar -cjf较高较慢.zipzip -r file.zip dir/中等快Windows 友好​日常用.tar.gz就行压缩速度和压缩率的平衡最好。3.4 别忘了清理服务器上的压缩包​ 拷完之后服务器上那个临时压缩包可以删掉sshroot192.168.1.100rm /home/data/results.tar.gz四、rsync只传有变化的部分​ rsync 是 scp 的升级版。它会对比本地和远程的文件差异只传输有变化的部分。第一次全量传之后增量传速度快很多。4.1 基本用法rsync-avzroot192.168.1.100:/home/data/results/ ./results/​ 三个常用参数参数含义-aarchive 模式保留权限、时间戳、子目录等最常用-vverbose显示传输过程-z传输时压缩网络慢的时候有用4.2 远程路径末尾的/很重要​ 这是 rsync 和 scp 最大的区别也是新手最容易踩的坑# 末尾有 /把 results 目录里的内容拷到本地 ./results/rsync-avzrootserver:/home/data/results/ ./results/# 末尾没 /把 results 这个目录本身拷过来会变成 ./results/results/rsync-avzrootserver:/home/data/results ./results/建议源路径末尾加/这样行为更直觉“把里面的东西同步过来”。4.3 指定端口rsync-avz-essh -p 2222rootserver:/home/data/results/ ./results/4.4 排除某些文件​ 不想拷日志、缓存之类的rsync-avz--exclude*.log--exclude__pycache__/rootserver:/home/data/results/ ./results/4.5 先预览再执行​ 不确定会传哪些文件加--dry-runrsync-avz--dry-run rootserver:/home/data/results/ ./results/​ 它会列出将要传输的文件但不会真的传。养成习惯大目录同步前先 dry-run 看一眼。五、怎么选场景推荐理由临时拷一两个文件scp最简单不用想目录里几千个小文件tar 压缩 scp打包成一个文件传快很多大目录之后还要反复同步rsync首次全量之后只传变化的想排除某些文件rsync--exclude很方便服务器没装 rsynctar scp只依赖 SSH哪都能用​ 一句话总结偶尔拷用 scp文件多先压缩长期同步用 rsync。​ 以后再遇到从服务器拷文件的需求顺着这张决策图走一遍就知道该用哪个工具了。六、实用补充6.1 从本地传到服务器​ 把从哪里和到哪里调换位置就行# scpscp-r./local_dir/ rootserver:/home/data/# rsyncrsync-avz./local_dir/ rootserver:/home/data/local_dir/6.2 配合 SSH 配置简化命令​ 如果你在~/.ssh/config里配了服务器别名Host myserver HostName 192.168.1.100 User root Port 22​ 那命令就可以简化成rsync-avzmyserver:/home/data/results/ ./results/​ 不用每次敲 IP 和用户名了。6.3 传输大文件时想看进度rsync-avz--progressrootserver:/home/data/bigfile.tar.gz ./--progress会显示每个文件的传输进度和速度。七、总结scp是最简单的远程拷贝scp -r拷目录适合临时传几个文件文件多的时候先压缩服务器上tar -czf打包scp 拉下来本地tar -xzf解压rsync是增量同步工具-avz三件套记住就行长期同步场景首选rsync 的源路径末尾加/避免多嵌套一层目录大目录同步前用--dry-run先预览配合~/.ssh/config可以大幅简化命令

更多文章