适用:所有 Linux 耗时:约 25 分钟 前置:T3(SSH 已通)
三个工具,三个用途:
| 工具 | 一句话 | 什么时候用 |
|---|---|---|
| scp | 简单的"复制",走 SSH | 传一两个文件 |
| rsync | 增量同步,只传变化的 | 传大量文件 / 做备份 |
| sftp | 交互式,像 FTP | 浏览远端目录、挑着下 |
核心区别:scp 每次都全传,rsync 只传改过的。
一、scp:最直接
语法
scp [源] [目标]
方向和 cp 一样,谁在前面谁是源。
# 本地 → 远程
scp 本地文件.txt 用户@主机:/remote/路径/
# 远程 → 本地
scp 用户@主机:/remote/文件.txt ./
# 传整个目录(必须 -r)
scp -r 本地目录/ 用户@主机:/remote/路径/
常用参数
| 参数 | 作用 |
|---|---|
-r | 递归(传目录必须) |
-P 端口 | 指定端口,大写 P(SSH 是小写 p,这里不一致) |
-i 密钥 | 指定私钥 |
-C | 压缩传输(慢网有用) |
-p | 保留时间戳和权限 |
-v | 显示过程 |
scp -P 2222 -r -C ./项目/ zhangsan@192.168.1.100:/srv/
scp 的三个坑
坑 1:端口是大写 -P
scp -P 2222 文件 user@host:/path # ✅
scp -p 2222 文件 user@host:/path # ❌ -p 是"保留时间戳"
SSH 用小写 -p,scp 用大写 -P。 这个不一致是历史遗留,只能记。
坑 2:路径后面有没有 / 区别很大
scp -r 目录 user@host:/srv/ # → /srv/目录/
scp -r 目录/ user@host:/srv/ # → /srv/ 下的内容(不再套一层)
和 cp 的规则一致,但远程路径容易忘。
坑 3:不支持断点续传 传一半断了,只能从头再来。大文件用 rsync。
二、rsync:传输和备份的正解
为什么值得学
只传变化的部分。 第一次传 1G,第二次改了 1M,那就只传 1M。
对备份来说这是决定性的——每天全量传 10G 和每天增量传 20M,是完全不同的量级。
基本用法
rsync -av 源/ 目标/
两个参数是核心:
| 参数 | 作用 |
|---|---|
-a | archive 归档模式:递归 + 保留权限/时间/属主/软链接(几乎总是要用) |
-v | 显示过程 |
# 本地 → 远程
rsync -av ~/文档/ zhangsan@主机:/backup/文档/
# 远程 → 本地
rsync -av zhangsan@主机:/srv/data/ ~/本地备份/
# 走非标准端口
rsync -av -e "ssh -p 2222" ~/文档/ zhangsan@主机:/backup/
⚠️ 路径末尾的 / 是生死线
这是 rsync 最容易出事的地方。
rsync -av 源目录/ 目标/ # 传"目录里的内容" → 目标/文件1, 目标/文件2
rsync -av 源目录 目标/ # 传"目录本身" → 目标/源目录/文件1, ...
记住一条:加 / = 只传内容;不加 / = 连目录一起传。
三个高频参数
| 参数 | 作用 | 危险度 |
|---|---|---|
--dry-run / -n | 只演练,不真做 | 安全 |
--delete | 目标端多余的文件删掉,和源保持完全一致 | ⚠️⚠️⚠️ 危险 |
--progress | 显示进度 | 安全 |
--delete 是双刃剑:
# 这是"镜像同步":目标 = 源的完整副本
rsync -av --delete 源/ 目标/
如果源写错了(比如源是一个空目录),目标会被清空。
铁律:第一次用
--delete,一定先加--dry-run看它要删什么。rsync -av --delete --dry-run 源/ 目标/看输出里的
deleting行。 有意外就停下来。
一个安全的备份模板
#!/bin/bash
set -euo pipefail
SRC="$HOME/文档/"
DEST="zhangsan@备份主机:/backup/文档/"
# 先演练
echo "=== 演练 ==="
rsync -av --delete --dry-run "$SRC" "$DEST" | tail -20
read -p "确认执行?(y/N) " ans
[ "$ans" = "y" ] || exit 0
rsync -av --delete --progress "$SRC" "$DEST"
echo "✅ 完成"
“先演练、再确认、才执行”——这个模式值得用在所有危险操作上。
断点续传
rsync -av --partial --append-verify 大文件 user@host:/path/
| 参数 | 作用 |
|---|---|
--partial | 保留传了一半的文件 |
--append-verify | 从断点继续,并校验已传部分 |
传大文件(几个 G 的镜像/视频)必用。
限速
rsync -av --bwlimit=5000 大目录/ user@host:/path/
--bwlimit 单位是 KB/s。5000 ≈ 5MB/s。
为什么限速:占满带宽会影响别人,也可能被运营商/单位网络限流。
三、sftp:像 FTP 一样浏览
要"看一眼远端有什么再挑着下",sftp 更方便。
sftp 用户@主机
进去之后是一个交互式 shell:
sftp> ls 列远端目录
sftp> cd /srv 切远端目录
sftp> lcd ~/下载 切本地目录(l = local)
sftp> pwd 远端当前目录
sftp> lpwd 本地当前目录
sftp> get 文件.txt 下载
sftp> get -r 目录/ 下载目录
sftp> put 本地文件.txt 上传
sftp> mkdir 新目录 远端建目录
sftp> rm 文件 删远端文件
sftp> exit 退出
关键记忆:前面加 l 就是操作本地(lcd / lpwd / lls)。
sftp 也有风险:
rm删的是远端文件,没有回收站。删之前先ls确认。
四、三个工具怎么选
只是传一两个文件?
└→ scp(简单,够用)
要传大量文件 / 做备份 / 经常重复传?
└→ rsync(增量,快得多)
要先看看远端有什么、挑着下?
└→ sftp(交互式)
给个具体判断:
| 场景 | 选择 | 理由 |
|---|---|---|
| 传一个配置文件 | scp | 一行搞定 |
| 部署网站(几百个文件) | rsync | 只传改过的 |
| 每天备份 | rsync --delete | 增量 + 镜像 |
| 传 5G 的镜像 | rsync --partial | 断了能续 |
| 从服务器挑几个日志下载 | sftp | 先看再下 |
五、图形化替代(桌面用户)
如果不想敲命令:
| 工具 | 说明 |
|---|---|
| 文件管理器地址栏 | 输入 sftp://用户@主机/路径 |
| FileZilla | 跨平台,支持 sftp/scp |
| Nautilus(GNOME 文件) | Ctrl+L 输 sftp://... |
文件管理器直接输 sftp:// 就能用——对桌面用户最方便,不用装任何东西:
文件管理器 → Ctrl+L → sftp://zhangsan@192.168.1.100/srv → 回车
注意:这种方式用的是 SSH 连接,密钥和 config 都生效。配好了免密就不用输密码。
六、动手:五个练习
练习 1:scp 传一个文件再传回来
# 造一个测试文件
echo "test" > /tmp/a.txt
# 传到远程(换成你的目标机器)
scp /tmp/a.txt 用户@主机:/tmp/
# 传回来
scp 用户@主机:/tmp/a.txt /tmp/b.txt
练习 2:验证 rsync 的增量
# 第一次同步
mkdir -p /tmp/src /tmp/dst
echo "1" > /tmp/src/a.txt
echo "2" > /tmp/src/b.txt
rsync -av /tmp/src/ /tmp/dst/
# 只改一个文件
echo "changed" > /tmp/src/a.txt
# 再同步 —— 观察输出,只有 a.txt 被传
rsync -av /tmp/src/ /tmp/dst/
输出里只会看到 a.txt,这就是增量。
练习 3:理解 / 的区别
mkdir -p /tmp/t1 /tmp/t2
rsync -av /tmp/src/ /tmp/t1/ # t1 里直接是 a.txt b.txt
rsync -av /tmp/src /tmp/t2/ # t2 里是 src/ 目录
ls /tmp/t1 /tmp/t2
练习 4:--dry-run 保护你
# 故意用错源(空目录)
mkdir -p /tmp/empty
rsync -av --delete --dry-run /tmp/empty/ /tmp/dst/
看输出里的 deleting 行——它会把 dst 里所有文件都删掉。
这就是为什么必须先 dry-run。
练习 5:sftp 浏览
sftp 用户@主机
sftp> ls
sftp> pwd
sftp> lpwd
sftp> exit
七、验证:你过关了吗
- 会用
scp双向传文件,-r传目录 - 知道 scp 的端口是大写
-P - 会用
rsync -av同步目录 - 清楚路径末尾
/的区别 - 知道
--delete前必须--dry-run - 会用
--partial断点续传 - 会用
sftp浏览和下载 - 知道文件管理器可以用
sftp://连接
八、不行怎么办
Q1:scp: command not found
有些新系统不预装:
sudo apt install openssh-client
Q2:rsync: command not found(在目标机器上)
rsync 需要两端都装:
ssh 用户@主机 "sudo apt install -y rsync"
Q3:rsync 报 Permission denied (13)
目标目录没写权限。检查:
ssh 用户@主机 "ls -ld /目标路径"
需要的话换路径,或者先建好有权限的目录。
Q4:传中文文件名乱码 两端 locale 不一致。在命令前加:
LC_ALL=C.UTF-8 rsync -av 源/ 目标/
Q5:rsync 很慢
- 加
-z压缩(慢网有用,快网反而拖慢) - 加
--bwlimit限速(如果不急,避免影响别人) - 文件数量太多(几十万个小文件)时 rsync 也会慢,考虑先打包再传
Q6:--delete 删多了,怎么恢复
没有回收站,删了就没了。 只能从备份恢复。
这就是为什么:
- 一定要先
--dry-run - 备份目标端本身也该有备份(3-2-1 原则,见 T7 备份)
Q7:scp 传一半断了
scp 不支持续传。改用:
rsync -av --partial --append-verify 大文件 user@host:/path/
九、一句话总结
scp 简单全量传,rsync 增量只传变的,sftp 交互式挑着下。
rsync 记住三件事:
-av、路径末尾/的含义、--delete前先--dry-run。传大文件用
--partial,别用 scp。
← 上一篇 T3|SSH 下一篇 → T5|Git:版本控制的最小闭环