适用:所有 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 源/ 目标/

两个参数是核心:

参数作用
-aarchive 归档模式:递归 + 保留权限/时间/属主/软链接(几乎总是要用)
-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 删多了,怎么恢复 没有回收站,删了就没了。 只能从备份恢复。 这就是为什么:

  1. 一定要先 --dry-run
  2. 备份目标端本身也该有备份(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:版本控制的最小闭环