SCP,全称 Secure Copy Protocol,中文常译为“安全复制协议”,是基于 SSH(Secure Shell) 的一种安全文件传输方式。SCP 主要用于在本地主机和远程主机之间进行文件或目录的复制。

SCP 实际上是一种 基于 SSH 的远程文件传输协议,其核心是利用 SSH 建立的加密通道进行文件传输,保证机密性和完整性。


1)本质

SCP 不是一个子系统(subsystem),而是直接 通过 SSH 会话执行远程 scp 命令 来进行文件传输。文件数据通过 SSH 通道加密传输,但 SCP 本身没有定义独立的报文格式。SCP 将文件复制任务交给远程主机的 scp 命令执行,通常一次性传输整个文件。不支持像 SFTP 那样的文件浏览、权限查询、断点续传或管道化读取。


SCP = SSH + 文件复制命令
SSH 负责:连接建立、加密、认证、完整性校验
SCP 负责:打包文件并通过 SSH 通道传输


2)SCP 报文层(内部机制)

SCP 本身没有像 SFTP 那样的消息类型定义,它是 通过 SSH 执行远程命令实现文件传输,其内部流程如下:

  1. 客户端通过 SSH 登录远程主机

  2. 客户端启动远程 scp 命令(例如 scp -t /remote/path 接收文件,scp -f /remote/path 发送文件)

  3. 双方通过标准输入输出流(stdin/stdout)交换控制消息

    • 控制消息是 ASCII 文本(如文件长度、权限、结束标识)

    • 文件数据以二进制流形式传输

  4. SSH 通道保证整个流的加密和完整性

控制消息示例(简化)

消息 含义
C<mode> <size> <filename>\n 告知接收方要传输的文件权限、大小和名称
D<mode> 0 <dirname>\n 开始传输目录
E\n 目录或文件传输结束
\0 成功确认

注意:SCP 的报文机制非常简单,基本都是 ASCII + 文件二进制流,没有独立的协议层。


3)SCP 文件传输流程示例(下载/上传)

文件下载(远程 → 本地):

  1. 客户端发起 SSH 连接至服务器 22 端口

  2. 完成密钥交换、用户认证

  3. 客户端执行远程命令:scp -f /remote/path/file

  4. 服务器返回控制消息:文件权限、大小、文件名

  5. 客户端发送确认 \0

  6. 服务器发送文件内容(二进制流)

  7. 客户端接收完成后发送确认 \0

  8. 传输完成,SSH 连接关闭

文件上传(本地 → 远程):

  1. 客户端发起 SSH 连接

  2. 执行远程命令:scp -t /remote/path/

  3. 客户端发送控制消息:文件权限、大小、文件名

  4. 服务器返回确认 \0

  5. 客户端发送文件内容(二进制流)

  6. 文件结束后发送结束标识

  7. 服务器返回最终确认

  8. SSH 连接关闭

SCP 不支持多线程或管道化读取,文件传输是顺序进行的,效率受限于单文件传输速率。


4)Linux 常用 SCP 命令

scp source_file user@host:/remote/path      # 上传文件
scp user@host:/remote/path/file .          # 下载文件到当前目录
scp -r local_dir user@host:/remote/path    # 上传目录
scp -r user@host:/remote/dir ./            # 下载目录
scp -P 2222 file user@host:/path           # 指定 SSH 端口
scp -i private_key.pem file user@host:/path # 使用私钥
scp -C file user@host:/path                # 开启压缩

常用选项说明:

选项 含义
-r 递归复制整个目录
-P 指定 SSH 端口
-i 指定私钥文件
-C 启用压缩,加速传输
-v 显示详细调试信息

5)常用工具及库

客户端 / GUI / CLI 工具

  • scp — 系统自带命令行工具,Linux/macOS/Windows 原生,基础文件上传下载

  • WinSCP — Windows GUI 客户端,支持 SCP/SFTP/FTP,可配置脚本自动化

  • FileZilla Client — 支持 SCP 的 GUI 客户端(需插件/配置)

  • pscp(PuTTY SCP) — Windows 命令行 SCP 客户端,轻量便捷

服务端 / 服务器软件

  • OpenSSH Server — Linux/Unix/macOS 原生,支持 SCP 与 SFTP

  • Windows OpenSSH Server — Windows 原生提供 SCP 支持,通过 SSH 实现

嵌入式 / 库 / 自动化工具

  • libssh / libssh2 — C/C++ 库,可实现 SSH/SCP 客户端和服务端功能

  • paramiko (Python) — 支持 SCP,通过 SSH 执行文件复制任务

  • Ansible / Fabric / SaltStack — 可利用 SCP 模块批量传输文件,实现自动化部署

  • POCO / Qt Network / Boost.Asio — 可在 C++ 项目中通过 SSH 执行 SCP 操作,适合嵌入式或自定义工具

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐