scp 是 secure copy 的缩写,是一个在 Linux/Unix 系统下用于通过网络在主机之间安全地复制文件的工具,它的底层依赖于 SSH 协议来保证数据传输的安全性。

核心语法
scp 的基本语法非常灵活,可以从本地复制到远程,也可以从远程复制到本地。
# 从本地复制到远程 scp [选项] 本地文件名 远程用户@远程主机:远程路径 # 从远程复制到本地 scp [选项] 远程用户@远程主机:远程文件名 本地路径
常用选项
| 选项 | 全称 | 描述 |
|---|---|---|
-P |
port |
指定远程主机的 SSH 端口。注意:大写 P,因为小写 -p 已被用于保留文件修改时间等属性。 |
-r |
recursive |
递归复制整个目录。 |
-p |
preserve |
保留文件的原始时间戳、权限、所有者等信息。 |
-C |
compress |
在传输过程中启用压缩,可以加快在慢速网络上的传输速度。 |
-q |
quiet |
静默模式,不显示进度条或警告信息。 |
-v |
verbose |
详细模式,会显示整个连接过程的调试信息,方便排查问题。 |
-i |
identity_file |
指定用于连接的私钥文件路径。 |
实用示例
场景准备
假设我们有以下环境:
- 本地主机:
local_machine(IP:168.1.10) - 远程主机:
remote_server(IP:0.113.10, 用户名:ubuntu) - SSH端口:
2222(非默认的22端口) - 本地文件:
~/project/report.txt - 本地目录:
~/project/assets/ - 远程目录:
/home/ubuntu/backups/
复制单个文件到远程
将本地的 report.txt 文件复制到远程主机的 /home/ubuntu/ 目录下。
# 基本用法 scp report.txt ubuntu@remote_server:/home/ubuntu/ # 指定远程路径(不一定是家目录) scp report.txt ubuntu@remote_server:/tmp/
从远程复制单个文件到本地
将远程主机上的 report.txt 文件复制到当前本地目录。
# 基本用法 scp ubuntu@remote_server:/home/ubuntu/report.txt . # 指定本地路径 scp ubuntu@remote_server:/home/ubuntu/report.txt ~/Downloads/
复制整个目录到远程
使用 -r (recursive) 选项来递归复制目录。
# 将本地的 'assets' 目录复制到远程主机的 '/home/ubuntu/backups/' 目录下 # 远程路径会变成 /home/ubuntu/backups/assets/ scp -r assets/ ubuntu@remote_server:/home/ubuntu/backups/
从远程复制整个目录到本地
# 将远程的 'backups/assets' 目录复制到当前本地目录 scp -r ubuntu@remote_server:/home/ubuntu/backups/assets/ .
指定非标准 SSH 端口
如果远程主机的 SSH 服务运行在非 22 端口(2222),必须使用 -P 选项。
# 复制文件到端口为 2222 的远程主机 scp -P 2222 report.txt ubuntu@remote_server:/home/ubuntu/ # 从端口为 2222 的远程主机复制文件 scp -P 2222 ubuntu@remote_server:/home/ubuntu/report.txt .
使用特定的 SSH 私钥文件
如果连接需要使用特定的私钥(id_rsa_myserver),使用 -i 选项。
# 使用 ~/.ssh/id_rsa_myserver 这个私钥进行认证 scp -i ~/.ssh/id_rsa_myserver report.txt ubuntu@remote_server:/home/ubuntu/
保留文件属性(时间戳、权限等)
使用 -p 选项,可以确保复制后的文件与原文件拥有相同的时间戳和权限。
scp -p report.txt ubuntu@remote_server:/home/ubuntu/
启用压缩传输
对于包含大量小文件或文本的目录,启用压缩可以显著提高传输速度。
# 复制目录并启用压缩 scp -rC assets/ ubuntu@remote_server:/home/ubuntu/backups/
结合多个选项
scp 命令可以自由组合多个选项。
# 示例:将本地的 'assets' 目录,通过端口 2222,使用特定私钥, # 启用压缩并保留属性,递归地复制到远程主机的指定目录。 # 注意选项的顺序通常不重要。 scp -r -C -p -P 2222 -i ~/.ssh/id_rsa_myserver assets/ ubuntu@remote_server:/home/ubuntu/backups/
scp vs rsync
scp 非常方便,但在处理大量文件或需要增量同步时,rsync 通常是更好的选择。
| 特性 | scp |
rsync |
|---|---|---|
| 核心功能 | 安全地复制文件/目录 | 远程同步文件/目录 |
| 传输效率 | 每次都是全量传输,如果文件中途中断,需要重新开始。 | 智能增量同步,只传输文件变化的部分,效率极高,支持断点续传。 |
| 带宽控制 | 不支持 | 支持 --bwlimit 选项,可以限制传输占用的带宽。 |
| 删除文件 | 不支持 | 支持 --delete 选项,可以使目标目录和源目录完全一致(删除目标中多余文件)。 |
| 文件列表 | 不支持 | 可以只同步匹配特定模式的文件(通过 --include/--exclude)。 |
| 适用场景 | 一次性、小批量文件复制;快速简单操作。 | 需要频繁同步、备份大量数据;需要增量更新;需要精确控制同步行为。 |
- 快速复制几个文件? 用
scp。 - 需要定期同步一个目录,并只传输变化的部分? 用
rsync。
scp 是系统管理员和开发人员必备的工具之一,它简单、直接、安全,记住其核心语法 [选项] 源文件 目标地址,并熟练掌握 -r, -P, -p, -i 等常用选项,就能应对绝大多数文件传输场景,对于更复杂的同步需求,则可以转向功能更强大的 rsync。
