Linux scp 命令详解
Linux scp 命令详解 🐧📄🌐
学习目标 🎯
- 理解
scp命令的基本功能与使用场景。 - 掌握本地与远程服务器之间、远程与远程之间的文件传输方法。
- 了解不同 Linux 发行版(如 Ubuntu、CentOS、EulerOS)在 SSH 配置和默认行为上的差异。
- 能结合实际开发、运维、脚本编写等场景灵活运用
scp。 - 熟悉常见错误及安全操作建议,确保数据传输安全可靠。
核心重点 ✅
| 类别 | 内容 |
|---|---|
| 命令含义 | secure copy 安全复制 |
| 基本语法 | scp [选项] 源路径 目标路径 |
| 核心功能 | - 本地到远程复制 - 远程到本地复制 - 远程到远程复制 |
| 常用参数 | -P, -r, -C, -i, -v |
| 依赖服务 | SSH 协议(需目标主机运行 sshd) |
| 权限控制 | 受 SSH 用户权限限制,普通用户不能访问 /root |
详细讲解 💡
1. 基本介绍 📘
📌 功能:
scp 是 secure copy protocol 的缩写,用于在本地主机与远程主机之间、或两个远程主机之间安全地复制文件。它基于 SSH 协议 加密传输,是 Linux 中最常用的远程文件传输方式之一。
📌 语法:
scp [选项] 源路径 目标路径
📌 示例:
scp file.txt ubuntu@192.168.1.10:/home/ubuntu/
⚠️ 注意:必须确保远程主机已安装并运行
openssh-server,否则无法连接!
2. 常用参数详解 🛠️
✅ -r:递归复制整个目录树(recursive)
复制整个目录及其子目录内容:
scp -r project/ ubuntu@192.168.1.10:/home/ubuntu/
👀 应用:项目部署、配置迁移、日志同步时非常实用。
✅ -P:指定远程主机的 SSH 端口(注意是大写 P)
如果远程服务器的 SSH 不是默认端口 22,需要指定:
scp -P 2222 file.txt ubuntu@192.168.1.10:/home/ubuntu/
👀 应用:企业级服务器常修改默认 SSH 端口以增强安全性。
✅ -C:启用压缩传输(compress)
减少网络带宽使用,提升传输速度:
scp -Cr project/ ubuntu@192.168.1.10:/home/ubuntu/
👀 应用:跨地域服务器、低带宽网络环境推荐使用。
✅ -i:使用指定的私钥进行身份验证(identity file)
如果你使用的是密钥认证而非密码登录:
scp -i ~/.ssh/id_rsa.pem file.txt ubuntu@192.168.1.10:/home/ubuntu/
👀 应用:云服务器(如阿里云、AWS)通常使用密钥对登录。
✅ -v:显示详细的调试信息(verbose)
scp -v file.txt ubuntu@192.168.1.10:/home/ubuntu/
👀 应用:排查连接失败、权限问题时非常有用。
3. 实际应用场景 🏢
🧱 场景一:从本地上传代码到云服务器(如阿里云 ECS)
scp -i ~/aliyun.pem -r myproject/ ubuntu@47.105.123.45:/home/ubuntu/
👀 应用:开发完成后一键部署项目到生产环境。
🧱 场景二:从远程服务器下载日志文件分析
scp -P 2222 ubuntu@192.168.1.10:/var/log/app.log /tmp/
👀 应用:运维人员日常排查问题时提取日志。
🧱 场景三:远程服务器之间直接传输文件(无需经过本地中转)
scp -r user1@server1:/data/logs/ user2@server2:/backup/
👀 应用:数据中心内部批量迁移数据时节省带宽。
4. 不同 Linux 发行版差异对比 🖥️🐧
| 对比项 | Ubuntu | CentOS | EulerOS |
|---|---|---|---|
| 默认 SSH 端口 | 22 | 22 | 22 |
| 是否默认开启 SSH 服务 | ❌(需手动安装 openssh-server) | ✅(安装后默认启动) | ✅(政企级默认开启) |
| 默认 SSH 密钥位置 | ~/.ssh/id_rsa | ~/.ssh/id_rsa | ~/.ssh/id_rsa |
| SELinux/AppArmor 影响 | ❌ | ✅(SELinux) | ✅(AppArmor/Euler 安全模块) |
| root 登录限制 | 默认禁止 | 默认允许 | 政企级默认严格限制 |
⚠️ 小贴士:在 EulerOS 等政企级系统中,默认可能禁止 root 用户通过 SSH 登录,建议创建普通用户并赋予 sudo 权限。
5. scp vs rsync 对比 🤔
| 特性 | scp |
rsync |
|---|---|---|
| 传输方式 | 基于 SSH 加密 | 基于 SSH 或 TCP |
| 断点续传 | ❌ | ✅ |
| 差量传输 | ❌ | ✅ |
| 复杂度 | 简单易用 | 更复杂但更强大 |
| 使用建议 | 快速小文件传输 | 大型目录同步、增量备份 |
👀 提示:后续章节将深入讲解
rsync,它是scp的高级替代方案。
6. 常见问题与解决方案 ❗
❌ 错误 1:连接被拒绝
ssh: connect to host 192.168.1.10 port 22: Connection refused
原因:SSH 服务未运行或防火墙阻止
解决:
- 在目标服务器执行:
sudo systemctl status ssh - 检查防火墙规则:
ufw status或firewall-cmd --list-all
❌ 错误 2:权限不足无法访问文件
scp: /root/file.txt: Permission denied
原因:当前用户没有权限访问 /root
解决:
- 使用有权限的账户(如 root)
- 或使用 sudo + scp 组合(不推荐直接 root 登录)
❌ 错误 3:找不到私钥文件
No such identity: ~/.ssh/id_rsa.pem: No such file or directory
原因:密钥路径错误或未生成
解决:
- 检查路径是否正确
- 使用
ssh-keygen生成密钥
7. 小技巧 & 高效用法 🚀
- Tab 补全:输入部分路径后按
Tab键自动补全。 - 历史记录:使用上下箭头键查看之前执行过的
scp命令。 - 批量复制多个文件:
scp file1.txt file2.txt ubuntu@192.168.1.10:/home/ubuntu/
- 配合变量使用(脚本中):
SRC="/var/log/app/*.log"
DEST="ubuntu@47.105.123.45:/mnt/nas/logs/"
scp -C $SRC $DEST
8. 实战练习题 🧪
🔍 练习 1:
请写出以下命令的作用:
scp -i ~/.ssh/mykey.pem -r /home/ubuntu/data/ user@192.168.2.5:/data/
📝 答案:
使用密钥 ~/.ssh/mykey.pem,递归复制本地 /home/ubuntu/data/ 目录到远程服务器 192.168.2.5 的 /data/ 路径下。
🔍 练习 2:
编写一个脚本 scp_upload.sh,实现以下功能:
- 接收三个参数:本地文件路径、远程主机地址、远程用户名
- 使用默认端口 22 和默认密钥路径
~/.ssh/id_rsa - 显示详细传输过程
📝 答案:
#!/bin/bash
FILE=$1
HOST=$2
USER=$3
if [ -z "$FILE" ] || [ -z "$HOST" ] || [ -z "$USER" ]; then
echo "Usage: $0 <file> <host> <user>"
exit 1
fi
scp -i ~/.ssh/id_rsa -v $FILE $USER@$HOST:/home/$USER/
使用方法:
chmod +x scp_upload.sh
./scp_upload.sh myfile.txt 47.105.123.45 ubuntu
总结 📋
scp 是 Linux 中最基础但极其强大的远程文件传输命令之一,尤其在跨服务器复制文件时不可或缺。它不仅适用于日常运维、程序调试、日志同步等多个场景,还广泛用于自动化脚本中。
掌握 scp 的各种参数组合,理解不同发行版之间的 SSH 配置差异,并结合实际场景灵活运用,可以显著提升你的工作效率和系统掌控能力。
建议多与 ssh, rsync, tar, find, scp, mv 等命令配合使用,形成完整的远程文件管理流程。

浙公网安备 33010602011771号