scp 是一个在 Linux/Unix 系统下基于 SSH (Secure Shell) 协议进行安全远程文件拷贝的工具,它的特点是简单、直接、安全,因为它利用了 SSH 的加密通道来传输数据,避免了明文传输的风险。

基本语法
scp 的基本语法结构如下:
scp [选项] [源文件] [目标文件]
这里的“源文件”和“目标文件”可以有以下四种组合形式:
- 从本地拷贝到远程
scp [选项] /path/to/local/file username@remote_host:/path/to/remote/directory
- 从远程拷贝到本地
scp [选项] username@remote_host:/path/to/remote/file /path/to/local/directory
- 在两个远程主机之间拷贝(本地作为跳板)
scp [选项] username1@host1:/path/to/file1 username2@host2:/path/to/directory2
- 目录拷贝
scp [选项] -r /path/to/local/directory username@remote_host:/path/to/remote/directory
核心选项
scp 提供了许多有用的选项,以下是其中最常用和最重要的几个:
| 选项 | 全称 | 描述 |
|---|---|---|
-P |
port |
指定远程主机连接的端口号。注意:这是大写的 P,因为小写的 -p 已经被 scp 用于“保留文件修改时间、访问时间和权限”了。 |
-p |
preserve |
保留文件的元数据,包括修改时间、访问时间和权限,默认情况下不开启。 |
-r |
recursive |
递归地拷贝整个目录,如果要拷贝目录,此选项是必需的。 |
-C |
compress |
在传输过程中开启压缩,对于文本文件或不大的二进制文件,可以显著提高传输速度。 |
-l |
limit |
限制带宽使用,单位为 Kbit/s。-l 800 表示限制使用 800 Kbit/s 的带宽,避免占用过多网络资源。 |
-i |
identity_file |
指定一个私钥文件来连接远程主机(~/.ssh/id_rsa),这对于使用非默认密钥或特定密钥非常有用。 |
-v |
verbose |
详细模式,显示整个连接过程的调试信息,如 SSH 密钥指纹、服务器指纹、数据传输统计等,在连接出现问题时非常有用。 |
-q |
quiet |
安静模式,不显示进度条和警告信息。 |
-4 |
ipv4 |
强制使用 IPv4 地址。 |
-6 |
ipv6 |
强制使用 IPv6 地址。 |
常用场景实例
假设我们有以下环境:

- 本地主机:
local_pc(IP:168.1.100) - 远程主机:
remote_server(IP:0.113.10, 用户名:ubuntu)
场景1:上传单个文件到远程服务器
将本地当前目录下的 report.txt 文件拷贝到远程服务器 remote_server 的 /home/ubuntu/documents/ 目录下。
scp report.txt ubuntu@203.0.113.10:/home/ubuntu/documents/
执行后会提示你输入 ubuntu 用户的密码。
场景2:从远程服务器下载单个文件
将远程服务器上的 data.zip 文件下载到本地当前目录。
scp ubuntu@203.0.113.10:/home/ubuntu/data.zip .
- 注意末尾的 ,代表当前本地目录。
场景3:上传整个目录
将本地当前目录下的 project_folder 文件夹递归地拷贝到远程服务器。
scp -r project_folder ubuntu@203.0.113.10:/home/ubuntu/
- 必须使用
-r选项。
场景4:从远程服务器下载整个目录
将远程服务器上的 archive_folder 下载到本地当前目录。
scp -r ubuntu@203.0.113.10:/home/ubuntu/archive_folder .
场景5:指定SSH端口
如果远程服务器的SSH端口不是默认的 22,而是 2222。
# 上传文件 scp -P 2222 report.txt ubuntu@203.0.113.10:/home/ubuntu/ # 下载文件 scp -P 2222 ubuntu@203.0.113.10:/home/ubuntu/data.zip .
- 再次强调,
-P是大写的。
场景6:使用SSH密钥进行免密登录
如果你已经配置了SSH密钥对(通过 ssh-keygen)并将公钥(~/.ssh/id_rsa.pub)添加到了远程服务器的 ~/.ssh/authorized_keys 文件中,你就可以使用 -i 指定私钥文件来实现免密登录。
# 上传文件 scp -i ~/.ssh/my_custom_key report.txt ubuntu@203.0.113.10:/home/ubuntu/
- 如果不指定
-i,scp默认会使用ssh默认的私钥文件(通常是~/.ssh/id_rsa或~/.ssh/id_dsa)。
场景7:限制传输速率
在拷贝一个大文件时,为了避免影响其他网络应用,可以限制带宽。
# 限制带宽为 1 Mbit/s (1000 Kbit/s) scp -l 1000 large_file.iso ubuntu@203.0.113.10:/tmp/
场景8:保留文件属性
确保拷贝后的文件与原文件的修改时间和权限保持一致。
scp -p report.txt ubuntu@203.0.113.10:/home/ubuntu/
场景9:开启压缩传输
对于文本文件或压缩效果好的文件,开启压缩可以加快传输速度。
scp -C large_log_file.txt ubuntu@203.0.113.10:/var/log/
场景10:两个远程主机之间传输文件
假设你需要在 server1 和 server2 之间传输文件,而你自己的 local_pc 可以访问这两台服务器。
# 将 server1 上的 file.txt 拷贝到 server2 的 /tmp/ 目录 # 你的 local_pc 会作为中间跳板 scp -r ubuntu@server1:/home/ubuntu/file.txt ubuntu@server2:/tmp/
- 这种情况下,你的
local_pc需要能无密码或通过密码登录到server1和server2。
安全注意事项
- 密码明文传输风险:虽然
scp本身是加密的,但在命令行中直接输入密码意味着你的密码可能会被记录在 Shell 的历史记录(~/.bash_history或~/.zsh_history)中,对于自动化脚本,这是一个严重的安全隐患。 - 最佳实践:使用SSH密钥:为了安全和自动化,强烈建议使用 SSH公钥认证 而非密码认证,你可以通过
ssh-copy-id命令轻松地将公钥推送到远程服务器。ssh-copy-id -i ~/.ssh/my_key.pub ubuntu@203.0.113.10
这样,之后所有基于SSH的工具(包括
scp,ssh,sftp)都可以免密登录,更加安全和方便。 - 文件覆盖风险:
scp在目标文件已存在时会直接覆盖,并且不会有任何确认提示,在执行拷贝操作前,请务必确认目标路径和文件名是否正确。
scp vs. rsync
scp 非常适合一次性、简单的文件拷贝任务,但如果你需要进行更复杂的同步操作,rsync (Remote Sync) 通常是更好的选择。
| 特性 | scp |
rsync |
|---|---|---|
| 功能 | 简单的文件/目录拷贝 | 功能强大的文件同步和备份工具 |
| 增量传输 | 不支持,每次都会完整传输所有文件。 | 支持,只传输源和目标之间有差异的部分,效率极高。 |
| 删除文件 | 不支持,无法删除目标端多余文件。 | 支持,可以删除目标端存在但源端不存在的文件(使用 --delete 选项)。 |
| 带宽控制 | 支持 (-l) |
支持 (--bwlimit) |
| 压缩 | 支持 (-C) |
支持 (-z) |
| 保留属性 | 支持 (-p) |
支持 (-a 或 -p) |
| 进度显示 | 无 | 有详细的进度条 |
- 用
scp:当你只是想快速地把一个或几个文件从A点拷贝到B点,不关心后续的同步,并且不介意每次都完整传输。 - 用
rsync:当你需要做备份、保持两个目录内容完全同步、或者只传输文件变化的部分时,rsync是无可替代的选择。
希望这份详细的 scp 命令指南能帮助你更好地使用它!
