下面我将从基本用法、常见场景、高级选项和常见问题几个方面,详细讲解 scp 命令。

基本语法
scp 的基本语法结构如下:
# 从本地拷贝到远程 scp [选项] [本地源文件] [用户名@远程主机IP:远程目标路径] # 从远程拷贝到本地 scp [选项] [用户名@远程主机IP:远程源文件] [本地目标路径] # 在两台远程主机之间拷贝(需要本地主机作为中转) scp [选项] [用户名1@主机1:文件路径] [用户名2@主机2:文件路径]
核心参数详解
[本地源文件] 或 [远程源文件]
这是你要拷贝的文件或目录的路径。
- 本地文件: 直接写本地路径,
./my_document.txt或/home/user/data.zip。 - 远程文件: 格式为
[用户名@远程主机IP:文件路径],root@192.168.1.100:/var/www/html/index.html。
[用户名@远程主机IP:远程目标路径] 或 [本地目标路径]
这是文件拷贝后要存放的位置。
- 远程目标路径: 格式同上,
backup@192.168.1.200:/mnt/backups/。 - 本地目标路径: 直接写本地路径,
~/Downloads/或/opt/。
[选项]
scp 提供了许多有用的选项,这里列出最常用的几个:

| 选项 | 全称 | 说明 |
|---|---|---|
-P |
port |
指定远程主机上 SSH 服务监听的端口号。注意:大写P,因为小写 -p 已被用于保留文件修改时间等属性。 |
-r |
recursive |
递归拷贝,如果源文件是一个目录,必须使用此选项来拷贝该目录下的所有内容。 |
-p |
preserve |
保留文件的修改时间、访问时间和权限模式。 |
-C |
compress |
在传输过程中开启压缩,对于慢速网络或大文件,可以显著提高传输速度。 |
-v |
verbose |
详细模式,显示整个连接过程中的调试信息,有助于排查连接问题。 |
-i |
identity_file |
指定一个私钥文件来代替默认的私钥进行身份验证。 |
-4 / -6 |
ipv4 / ipv6 |
强制使用 IPv4 或 IPv6 地址进行连接。 |
常见使用场景
场景1:从本地拷贝文件到远程服务器
这是最常见的用法,比如将本地的代码或备份上传到服务器。
# 将本地当前目录下的 file.txt 拷贝到远程服务器的 /home/username/ 目录下 scp file.txt username@remote_host:/home/username/ # 将本地目录 my_project 整个拷贝到远程服务器的 /var/www/ 目录下(注意 -r) scp -r my_project username@remote_host:/var/www/ # 使用指定端口(2222)拷贝文件 scp -P 2222 file.txt username@remote_host:/home/username/ # 拷贝文件并保留其原始属性,同时开启压缩 scp -p -C file.txt username@remote_host:/home/username/
场景2:从远程服务器下载文件到本地
比如从服务器下载日志文件或备份文件。
# 将远程服务器上的 /home/username/remote_file.txt 下载到本地当前目录 scp username@remote_host:/home/username/remote_file.txt . # 将远程服务器上的整个 logs 目录下载到本地的 ~/Downloads/ 目录下 scp -r username@remote_host:/var/log/ ~/Downloads/ # 使用指定端口下载文件 scp -P 2222 username@remote_host:/home/username/remote_file.txt .
场景3:在两台远程主机之间直接拷贝文件
这个场景比较特殊,它不是从本地发起的拷贝,而是让本地主机作为“信使”,连接两台远程主机完成文件传输,这种方式的好处是,你的本地机器不需要有足够的磁盘空间来暂存这个大文件。
# 将主机A上的文件,直接拷贝到主机B上 # 本地主机需要能无密码登录到主机A和主机B(通常使用SSH密钥) scp username1@host1:/path/to/file.txt username2@host2:/path/to/destination/
进阶技巧与注意事项
使用 SSH 密钥认证(推荐)
每次都输入密码很麻烦,也不安全,配置好 SSH 密钥后,scp 可以实现无密码登录。
- 步骤:
- 在本地主机生成 SSH 密钥对(如果还没有的话):
ssh-keygen -t rsa - 将公钥(
~/.ssh/id_rsa.pub)复制到远程主机的~/.ssh/authorized_keys文件中。ssh-copy-id username@remote_host
- 在本地主机生成 SSH 密钥对(如果还没有的话):
- 效果: 之后所有使用
ssh或scp的连接都将自动使用密钥认证,无需输入密码。
指定私钥文件
如果你有多个私钥文件,或者私钥不在默认位置 (~/.ssh/id_rsa),可以使用 -i 选项指定。
# 使用 ~/.ssh/my_custom_key 这个私钥连接 scp -i ~/.ssh/my_custom_key file.txt username@remote_host:/home/username/
scp 与 rsync 的选择
scp 非常简单易用,但对于增量同步(只同步变化的部分)和断点续传,rsync 是更好的选择。
-
rsync的优势:- 高效: 只拷贝源文件和目标文件之间有差异的部分,非常适合同步大目录。
- 断点续传: 如果传输中断,
rsync可以从断点继续传输,而不是从头开始。 - 更多功能: 如删除目标端多余的文件、显示传输进度条等。
-
何时用
scp:- 一次性、简单的文件拷贝。
- 确保所有文件的属性(时间戳、权限)都被保留。
- 不需要增量同步功能。
常见问题排查
Permission denied (publickey,password).
这表示认证失败,可能的原因:
- 用户名或密码错误。
- SSH 密钥没有正确设置。
- 远程主机的 SSH 服务配置禁止了密码登录或密钥登录。
- 指定的私钥文件不正确或权限不正确(私钥文件权限通常需要设置为
600)。
ssh: connect to host xxx port 22: Connection timed out
无法连接到远程主机。
- 检查网络: 确保本地机器可以访问远程主机的 IP 地址。
- 检查防火墙: 确认远程主机的防火墙(如
ufw,firewalld)允许 22 端口的入站连接。 - 检查 SSH 服务: 确认远程主机上的 SSH 服务正在运行 (
sudo systemctl status ssh)。 - 检查 IP 和端口: 确认 IP 地址和端口号(如果不是默认 22)没有写错。
scp: /path/to/destination: Not a directory
当你要拷贝一个目录时,忘记使用 -r 选项,或者目标路径不是一个已存在的目录。
- 解决方案: 在源文件/目录后加上
-r选项。
scp 是运维和开发人员必备的命令之一,记住它的核心用法和常用选项 (-r, -P, -p, -C),就能解决绝大多数文件传输问题,对于需要频繁同步和更高级控制需求的场景,可以学习并使用 rsync。
