scp 与 rsync:复制文件
在您的电脑和服务器之间传输文件的两个命令:什么时候 scp 就够了、rsync 有什么用,以及如何避免因末尾斜杠覆盖别人的目录。
更新于 2026年8月23日
图形化客户端适合临时改一次文件,但部署和备份用一条命令更省事。
scp:一次性复制
语法和 cp 一样,只是把路径换成了机器地址:
scp dump.sql root@203.0.113.10:/root/
scp root@203.0.113.10:/var/log/nginx/error.log ./
scp -r ./site root@203.0.113.10:/var/www/
第一条命令发送文件,第二条把文件拉回来,第三条复制整个目录(-r)。
如果 SSH 运行在其他端口,用大写的 -P 指定:
scp -P 2222 dump.sql root@203.0.113.10:/root/
有了 ~/.ssh/config 文件,命令会更短:scp dump.sql vds:/root/。
rsync:同步
rsync 只传输差异部分,可以续传中断的传输并显示进度。对于反复部署来说,它要快上许多倍。
rsync -avz --progress ./site/ root@203.0.113.10:/var/www/example.com/
| 参数 | 作用 |
|---|---|
-a | 保留权限、时间戳、链接 |
-v | 打印文件列表 |
-z | 压缩数据流 |
--progress | 显示传输进度 |
--delete | 删除机器上您没有的文件 |
--exclude | 跳过不需要的内容 |
一次干净部署的示例:
rsync -avz --delete \
--exclude '.git' --exclude 'node_modules' --exclude '.env' \
./site/ vds:/var/www/example.com/
把副本从机器拉到本地:
rsync -avz vds:/root/backup-2026-08-23.tar.gz ./backups/
源路径末尾的斜杠表示“目录的内容”。
./site/会把文件放进目标目录里,./site则会在目标目录里创建一个site子目录。一半所谓“部署丢失”的问题都是它造成的。
小心 --delete
--delete 参数会让机器上的目录变成您本地目录的精确副本:多出来的内容会被直接删除,不会询问。先做一次试运行:
rsync -avzn --delete ./site/ vds:/var/www/example.com/
-n 参数只显示会发生什么。确认无误后,去掉 n 即可。
速度
磁盘速度按套餐限制:每个核心写入 60 MB/s(不低于 60,也不高于 400),读取是写入的两倍,突发速度可达上限的三倍,持续 30 秒。网络带宽最高 500 Mbit/s。在 VDS-1 上,上传大压缩包会触及写入上限,这是正常现象,不是故障。查看当前情况:
df -h
iostat -x 2
常见错误
| 现象 | 原因 |
|---|---|
Permission denied | 您正在写入不属于自己用户的目录——请以 root 登录或更改所有者 |
No such file or directory | 机器上不存在该目录,而 scp 不会创建它:请先执行 mkdir -p |
| 文件放到了上一层 | 路径末尾的斜杠多了或少了 |
rsync: command not found | 请在两端都安装该软件包:apt install -y rsync |
| 部署后网站返回 403 | 所有者未设置:chown -R www-data:www-data /var/www/example.com |
如果您更喜欢图形化客户端,请参阅通过 SFTP 传输文件。