以下是 Linux 中 scp(secure copy)命令的详细讲解,涵盖常用用法、选项、典型场景和注意事项,适合初学者到中高级用户参考。
1. 什么是 scp 命令?
scp 是基于 SSH 协议的文件/目录安全传输工具,用于:
- 本地 ↔ 远程服务器
- 远程服务器 ↔ 远程服务器
- 本地 ↔ 本地(较少用)
它比 ftp、rsync(默认明文)更安全,因为数据全程加密。
2. 基本语法
scp [选项] 源地址 目标地址
常用格式:
# 本地 → 远程
scp 本地文件/目录 用户名@远程主机:远程路径
# 远程 → 本地
scp 用户名@远程主机:远程文件/目录 本地路径
# 远程 → 远程
scp 用户名1@主机1:文件 用户名2@主机2:目标路径
3. 常用选项一览(最重要)
| 选项 | 说明 | 示例 |
|---|---|---|
-r | 递归复制目录(必须加) | scp -r dir user@host:/path/ |
-P | 指定 SSH 端口(大写 P) | -P 2222 |
-p | 保留文件的权限、时间戳等属性 | 常用于备份场景 |
-v | 显示详细调试信息(排查连接问题) | |
-q | 安静模式,不显示进度条和警告 | 脚本中常用 |
-C | 启用压缩传输(适合文本文件、大文件) | 节省带宽 |
-i | 指定私钥文件 | -i ~/.ssh/mykey |
-l | 限制带宽(单位 Kbit/s) | -l 1000 ≈ 1Mbps |
-F | 指定自定义 ssh 配置文件 | 很少用 |
-o | 传递 ssh 选项(如 StrictHostKeyChecking) | -o StrictHostKeyChecking=no |
4. 实用示例(按场景分类)
4.1 本地上传到远程服务器
# 上传单个文件
scp report.pdf user@192.168.1.100:/home/user/docs/
# 上传目录(必须加 -r)
scp -r my_project/ user@192.168.1.100:/var/www/
# 上传到用户家目录(可省略路径)
scp nginx.conf user@server:~/
# 指定端口 + 私钥
scp -P 2222 -i ~/.ssh/id_rsa_prod backup.tar.gz prod@203.0.113.5:/backup/
4.2 从远程服务器下载到本地
# 下载单个文件
scp user@server:/var/log/app.log ./logs/
# 下载整个目录
scp -r user@server:/home/user/data ./data_backup/
# 下载并保留权限/时间戳
scp -rp user@server:/etc/nginx/nginx.conf ./nginx.conf.bak
4.3 服务器之间传输(跳板场景)
# 从 server1 复制到 server2
scp user1@server1:/data/bigfile.zip user2@server2:/data/
# 通过跳板机(本地先到跳板,再到目标)——更推荐用 rsync 或 ssh 代理
4.4 常用高级组合
# 压缩传输 + 递归 + 保留属性 + 指定端口
scp -Crp -P 2222 -C big_folder/ user@host:/target/
# 限速 5MB/s(50000 Kbit/s)传输大文件
scp -l 50000 large_video.mp4 user@host:/downloads/
# 跳过首次连接的 "Are you sure you want to continue connecting?" 提示
scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null file user@host:/path
# 只传输目录中 .sql 文件
scp user@host:/backup/*.sql ./restore/
5. 常见问题与解决
| 问题 | 解决方法 |
|---|---|
提示 Permission denied | 1. 检查用户名/密码/密钥 2. 检查目标目录写权限 ls -ld 目标目录 |
| 连接超时 / No route to host | 检查网络、防火墙、端口(默认 22)、-P 是否写错 |
Host key verification failed | 1. ssh-keygen -R 主机IP 清空旧记录2. 加 -o StrictHostKeyChecking=no |
| 速度很慢 | 1. 加 -C 压缩2. 检查网络 3. 考虑用 rsync 替代 |
| 拷贝大量小文件很慢 | scp 不擅长大量小文件,建议改用 rsync -avz --progress |
| 想看到进度条 | 默认有进度条;若没有,可加 -v 或使用 rsync |
6. scp vs rsync 快速对比(建议记住)
| 项目 | scp | rsync |
|---|---|---|
| 协议 | SSH | SSH 或 rsync daemon |
| 增量传输 | 不支持 | 支持(只传差异部分) |
| 大量小文件 | 较慢 | 快很多 |
| 断点续传 | 不支持 | 支持(配合 --partial) |
| 保留属性 | -p | -a(更全面) |
| 压缩 | -C | -z |
| 进度条友好 | 一般 | 更好 |
| 推荐场景 | 偶尔传几个文件/目录 | 备份、同步、大目录、频繁传输 |
结论:日常简单传输 → 用 scp;需要高效、增量、大量文件 → 优先考虑 rsync。
7. 小技巧速查
# 快速把本地当前目录传到远程同名目录
scp -r . user@host:/home/user/project/
# 只传目录内容(不包含最外层文件夹)
scp -r ./myapp/* user@host:/var/www/myapp/
# 批量上传所有 .zip 文件
scp *.zip user@host:~/downloads/
希望这篇详解对你有帮助!如果有具体场景(比如“如何传 100G 数据”“公司内网跳板机怎么传”),可以告诉我,我再给你更针对性的写法。