SSH 常见用法(四):使用 SCP 和 SFTP 远程传输文件
系列导读
本系列共包含一篇总览和四篇专题文章:
| 系列位置 | 文章主题 | 主要内容 |
|---|---|---|
| 总览 | 浅谈 SSH | 认识 SSH 及其四种常见用法 |
| 第一篇 | SSH 常见用法(一):远程登录服务器 | 密码登录、密钥认证和 ~/.ssh/config |
| 第二篇 | SSH 常见用法(二):通过 SSH 认证访问 Git 仓库 | 配置 SSH Key,并通过 SSH 操作远程仓库 |
| 第三篇 | SSH 常见用法(三):SSH 隧道与端口转发 | 本地与远程端口转发 |
| 第四篇(本文) | SSH 常见用法(四):使用 SCP 和 SFTP 远程传输文件 | 在本机与服务器之间安全传输文件 |
一、前言
SSH 是一种安全访问和操作远程计算机的方式。
SSH 的全称是 Secure Shell(安全外壳协议),是一种用于安全访问和操作远程计算机的加密网络协议。
SSH 主要提供三项安全能力:
- 加密通信:防止用户名、密码、命令和传输内容被窃听。
- 确认服务器身份:帮助客户端判断当前连接的是不是目标服务器。
- 确认登录者身份:服务器可以通过密码或 SSH Key 验证客户端身份。
SSH 常见的使用场景包括远程登录服务器、Git 身份认证、端口转发和远程文件传输。本文讨论其中的第四种:使用 SCP 和 SFTP 在本机和远程服务器之间安全传输文件。
SSH 远程传输文件,本质上就是:
利用 SSH 的加密连接,在本机和远程服务器之间安全地复制文件。
最常见有两个工具:
| 工具 | 作用 |
|---|---|
| scp | 直接复制文件/目录,简单常用 |
| sftp | 类似 FTP 的交互式文件传输,但走 SSH |
最常见的是 scp。

二、SCP:使用命令直接复制文件
2.1 本地到远程
2.1.1 上传单个文件
语法:
bash
scp 本地文件 用户名@服务器IP:远程目录
例如,把本机的 test.txt 上传到远程服务器的 /home/devuser/ 目录:
bash
scp test.txt devuser@203.0.113.10:/home/devuser/
意思是:
Plain
本机 test.txt
↓
SSH 加密传输
↓
远程服务器
203.0.113.10
↓
/home/devuser/
2.1.2 上传整个文件夹
上传文件夹时,需要添加 -r 参数:
bash
scp -r 本地文件夹 用户名@服务器IP:远程目录
例如,把本机的 project 文件夹上传到远程服务器:
bash
scp -r project/ devuser@203.0.113.10:/home/devuser/
其中:
text
-r
= recursive
= 递归复制文件夹及其全部内容
2.2 远程到本地
2.2.1 下载单个文件
语法:
bash
scp 用户名@服务器IP:远程文件 本地目录
例如,把远程服务器上的 test.txt 下载到本机当前目录:
bash
scp devuser@203.0.113.10:/home/devuser/test.txt ./
2.2.2 下载整个文件夹
语法:
bash
scp -r 用户名@服务器IP:远程文件夹 本地目录
例如,把远程服务器上的 project 文件夹下载到本机当前目录:
bash
scp -r devuser@203.0.113.10:/home/devuser/project/ ./
2.3 使用非默认 SSH 端口
如果 SSH 不是默认 22 端口,比如 31022,scp 要用大写 -P:
Bash
scp -P 31022 test.txt devuser@203.0.113.10:/home/devuser/
注意这里和 ssh 不一样:
Plain
ssh 指定端口:-p
scp 指定端口:-P
2.4 SCP 常用命令速查
所以这一块你先记一句就够了:
scp= 通过 SSH 在本机和远程服务器之间复制文件或文件夹。
最核心的四种操作:
text
# 上传文件
scp 本地文件 user@server:远程路径
# 上传文件夹
scp -r 本地文件夹 user@server:远程路径
# 下载文件
scp user@server:远程文件 本地路径
# 下载文件夹
scp -r user@server:远程文件夹 本地路径
三、SFTP:交互式管理远程文件
SFTP 的全称是 SSH File Transfer Protocol。它通过 SSH 建立加密连接,并提供一个可以连续浏览、上传和下载文件的交互式操作环境。
SFTP 是独立的文件传输协议,并不是简单地给传统 FTP 增加 SSH 加密。
3.1 建立 SFTP 连接
使用默认的 22 端口:
bash
sftp devuser@203.0.113.10
如果 SSH 使用非默认端口,例如 31022,需要使用大写 -P:
bash
sftp -P 31022 devuser@203.0.113.10
如果已经在 ~/.ssh/config 中配置了服务器别名,也可以直接执行:
bash
sftp dev-server
连接成功后,会进入 SFTP 交互环境:
text
sftp>
3.2 区分本机与远程命令
进入 SFTP 后,默认的文件操作通常针对远程服务器。以 l 开头的对应命令用于操作本机,其中 l 可以理解为 local。
| 命令 | 作用 |
|---|---|
pwd |
查看远程服务器当前目录 |
lpwd |
查看本机当前目录 |
ls |
查看远程服务器中的文件 |
lls |
查看本机文件 |
cd |
切换远程服务器目录 |
lcd |
切换本机目录 |
mkdir |
在远程服务器上创建目录 |
lmkdir |
在本机创建目录 |
例如:
text
sftp> pwd
Remote working directory: /home/devuser
sftp> lpwd
Local working directory: /Users/yourname
3.3 本地到远程
3.3.1 上传单个文件
在 SFTP 交互环境中,使用 put 上传文件:
text
sftp> put test.txt /home/devuser/test.txt
如果省略远程文件名,通常会使用原来的文件名:
text
sftp> put test.txt
3.3.2 上传整个文件夹
使用 put -R 递归上传文件夹:
text
sftp> put -R project/ /home/devuser/
3.4 远程到本地
3.4.1 下载单个文件
使用 get 把远程文件下载到本机:
text
sftp> get /home/devuser/test.txt ./
如果省略本地保存路径,文件会下载到 lpwd 显示的本机当前目录:
text
sftp> get /home/devuser/test.txt
3.4.2 下载整个文件夹
使用 get -R 递归下载远程文件夹:
text
sftp> get -R /home/devuser/project/ ./
这里要注意 SCP 与 SFTP 的递归参数区别:
text
SCP 复制文件夹:scp -r # 小写 -r
SFTP 上传文件夹:put -R # 大写 -R
SFTP 下载文件夹:get -R # 大写 -R
3.5 退出 SFTP
完成传输后,可以使用 exit 或 bye 退出:
text
sftp> exit
四、SCP 与 SFTP 对比
| 对比项 | SCP | SFTP |
|---|---|---|
| 使用方式 | 一条命令直接复制 | 连接后进入交互环境 |
| 上传文件 | scp file user@server:path |
put file |
| 下载文件 | scp user@server:file ./ |
get file |
| 浏览远程目录 | 不方便 | 支持 pwd、ls、cd |
| 连续执行多个操作 | 每次单独执行命令 | 可以在同一个会话中连续操作 |
| 适用场景 | 快速复制文件或目录 | 浏览和管理远程文件 |
五、总结
SCP 适合通过一条命令快速复制文件或目录;SFTP 适合进入交互式会话,浏览并连续管理远程文件。
两者都通过 SSH 建立加密连接,也都可以复用 SSH 密钥和 ~/.ssh/config 中的服务器配置。
个人声明: 本文为个人学习笔记,如有错误,欢迎指正。