从另一个服务器拷贝文件夹,Linux下最常用也最可靠的方式是 scp -r,想要断点续传或增量同步就用 rsync -avz。 这两个命令覆盖了绝大多数场景,一个简单直接,一个功能强大,下面我把我日常处理服务器迁移、备份时实际用到的操作细节全部拆开讲,照着复制就能用。
linux服务器之间拷贝文件命令详解
先明确一个基础认知:Linux服务器之间传文件,本质上就是走 SSH 通道,无论是 scp 还是 rsync,底层都依赖 SSH 协议,这意味着你只要搞定了 SSH 登录,拷贝文件夹就是顺手的事。
拷贝前的三个准备工作
动手之前,先确认三件事,能帮你避开 80% 的坑:
- 目标服务器的 IP 地址或域名。
168.1.100或backup.example.com。 - 登录账号和端口,默认端口是 22,如果改过端口,比如改成了 2222,命令里必须显式加
-P 2222(注意scp用的是大写P,ssh用小写p,这个细节坑过不少人)。 - SSH 免密登录是否已配置,没配置的话,每次拷贝都要输密码;配置了则脚本化操作更顺手。
行业共识认为,给服务器配置 SSH 密钥登录是提升效率的第一步,生成密钥很简单:
ssh-keygen -t rsa -b 4096
一路回车,然后把你本机的公钥推送到目标服务器:
ssh-copy-id -p 端口号 用户名@服务器IP
之后再用 scp 或 rsync,就不用反复输密码了。
scp命令的完整实操
scp 是 Secure Copy 的缩写,用法跟 cp 很像,只是路径变成了 用户名@主机:路径 的格式。
从远程服务器拉取文件夹到本地
比如我想把 168.1.100 上 /var/www/html 整个目录下载到当前机器的 /home/user/backup 下:
scp -r root@192.168.1.100:/var/www/html /home/user/backup
-r参数表示递归复制整个目录,不加会报错。- 如果目标服务器 SSH 端口不是默认的 22,用
-P指定:
scp -P 2222 -r root@192.168.1.100:/var/www/html /home/user/backup
将本地文件夹推送到远程服务器
反向操作,把本地的 ./build 目录推送到远程服务器的 /opt/www:
scp -r ./build root@192.168.1.100:/opt/www
注意:如果远程目录 /opt/www 已经存在,scp
会把 build 文件夹放进 /opt/www 里面,变成 /opt/www/build直接合并到 /opt/www 下,需要自己先处理目录层级,这是 scp 不如 rsync 方便的地方。
保留文件属性
拷贝网站源码或配置文件时,文件权限和时间戳很重要,加上 -p 可以保留这些属性:
scp -rp root@192.168.1.100:/etc/nginx /home/user/nginx-backup
scp的局限在哪里
scp 简单归简单,但有两个明显的短板:
- 不支持断点续传,传了一半网络断了,重新来过,大文件时非常痛苦。
- 不做增量同步,每次都是全量复制,哪怕远程文件夹只改了一个 1KB 的小文件,也要把整个目录重新传一遍。
当文件夹体积较大(比如超过 1GB)或者需要频繁同步时,业界主流做法是改用 rsync。
linux跨服务器复制目录的rsync方案
rsync 是 Linux 服务器之间做文件同步的瑞士军刀,它厉害的地方在于增量传输只传送源目录和目标目录之间有差异的部分,节省时间也节省带宽。
rsync基础命令
把刚才 scp 的第一个场景用 rsync 重写一遍:
rsync -avz -e ssh root@192.168.1.100:/var/www/html /home/user/backup
参数拆解:
-a归档模式,表示递归复制并保留权限、时间戳、软链接等属性。-v显示详细输出,方便观察进度。-z传输时压缩,对文本类文件(代码、配置文件)效果拔群。-e ssh指定使用 SSH 作为传输通道,这是跨服务器拷贝的标准姿势。
rsync的断点续传与增量同步
这是 rsync 碾压 scp 的核心技能,传输中断后,重新执行同一条命令,它会自动跳过已传完的部分,只传剩余数据:
rsync -avzP -e ssh root@192.168.1.100:/var/www/html /home/user/backup
-P 等价于 --partial --progress,--partial 表示保留部分传输的文件,--progress 显示实时进度百分比。
场景实操:网站日志同步
假设我有两台服务器,A 是 Web 服务器,B 是日志分析服务器,每天凌晨把 A 上的日志同步到 B:
rsync -avz -e ssh --remove-source-files root@A服务器IP:/var/log/nginx/ /data/logs/nginx/
--remove-source-files 表示传输成功后删除源端的文件,避免 A 服务器磁盘被日志撑爆,这个操作非常适合
日志集中管理的场景。
权限保留与特殊文件处理
网站迁移时,文件属主和权限错乱是常见问题。rsync 的 -a 参数已经包含了权限保留,但如果你需要明确指定属主和属组,可以加:
rsync -avz --chown=www:www -e ssh root@192.168.1.100:/var/www/html /home/user/backup
--chown=www:www 把拷贝过来的文件属主强制设为 www 用户、www 组,这在部署 PHP 或 Node.js 项目时特别实用,能避免权限不足导致的 500 错误。
只排除不想要的目录
拷贝整个站点时,node_modules、runtime 这类体积大又没用的目录应该跳过,用 --exclude 参数:
rsync -avz -e ssh --exclude='node_modules' --exclude='.git' --exclude='runtime' root@192.168.1.100:/var/www/html /home/user/backup
多个排除项可以重复使用 --exclude,也可以写进一个文件里管理:
rsync -avz -e ssh --exclude-from=/home/user/exclude-list.txt root@192.168.1.100:/var/www/html /home/user/backup
exclude-list.txt 每行写一个目录名,
node_modules .git runtime .log
scp与rsync怎么选:linux服务器之间传文件哪个快
很多新手纠结这个问题,明确一个结论:数据传输速度本身差别不大,真正的差距在传输策略。
| 对比项 | scp | rsync |
|---|---|---|
| 首次全量传输 | 速度相当 | 速度相当 |
| 增量传输 | 不支持 | 支持,只传差异部分 |
| 断点续传 | 不支持 | 支持(--partial) |
| 权限保留 | 需 -p 参数 |
-a 参数默认保留 |
| 压缩传输 | 需 -C 参数 |
-z 参数更灵活 |
| 排除目录 | 不支持 | --exclude 支持 |
| 适用场景 | 小文件夹、一次性拷贝 | 大目录、持续同步、迁移 |
什么时候用 scp:
- 文件夹很小(几百 MB 以内),一次性操作。
- 不想记太多参数,命令行越短越好。
- 目标机器 SSH 版本较老,
rsync可能没装。
什么时候用 rsync:
- 文件夹超过 1GB,网络不稳定。
- 需要定期同步(配合 cron 定时任务)。
- 迁移网站、数据库文件目录,需要保留权限。
- 服务器之间传文件哪个快这个问题,增量场景下
rsync明显更快,因为传的数据量小。
我给客户做服务器迁移时,默认方案就是 rsync -avzP,稳且可控,如果客户要求最简单省事,一次性的小目录才用 scp。
定时同步的配置思路
如果你需要每天凌晨自动同步,把 rsync 命令写进脚本,配合 crontab 即可:
crontab -e
加入一行(每天凌晨 2 点执行):
0 2 /usr/bin/rsync -avzP -e ssh root@192.168.1.100:/var/www/html /home/user/backup >> /var/log/rsync-backup.log 2>&1
业内专家指出,定时增量同步是服务器备份最省钱的方案,比任何云厂商的块存储快照都灵活。
跨服务器拷贝时遇到密码问题的处理
如果不想配置 SSH 免密,也可以考虑用 sshpass 在命令中直接指定密码,但安全性较差,不推荐在生产环境使用,从安全角度考虑,建议按以下优先级选择:
- SSH 密钥认证(推荐)。
- 使用
ssh-agent管理密钥。 - 仅在受信任的内网环境使用
sshpass。
配置密钥时注意文件权限,~/.ssh 目录权限应为 700,authorized_keys 文件权限应为 600,否则 SSH 服务会拒绝使用密钥登录。
常见疑问解答
拷贝文件夹时遇到权限不足怎么办
scp 或 rsync 报 Permission denied,多数情况是目标目录的写权限不够,先确认当前登录用户对目标目录是否有写权限,或者直接切换到 root 用户执行:
sudo scp -r root@192.168.1.100:/var/www/html /home/user/backup
如果目标目录属于其他用户,可以先用 chown 调整属主。
传输中断后必须从头开始吗
scp 必须从头开始,因为协议不支持断点续传。rsync 加 -P 参数后,重新执行原命令即可从断点继续,已完成的部分不会重复传输,所以大文件传输建议一律使用 rsync。
如何确认拷贝后的文件完整性
rsync 传输完成后,可以对比源目录和目标目录的校验值:
diff -r root@192.168.1.100:/var/www/html /home/user/backup
或者用 rsync 自带的 -c 参数强制校验文件内容:
rsync -avzc -e ssh root@192.168.1.100:/var/www/html /home/user/backup
-c 会逐文件计算校验值,确保内容一致,代价是速度稍慢。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/555789.html



