Linux scp 命令详解

Linux scp 命令详解 🐧📄🌐


学习目标 🎯

  • 理解 scp 命令的基本功能与使用场景。
  • 掌握本地与远程服务器之间、远程与远程之间的文件传输方法。
  • 了解不同 Linux 发行版(如 Ubuntu、CentOS、EulerOS)在 SSH 配置和默认行为上的差异。
  • 能结合实际开发、运维、脚本编写等场景灵活运用 scp
  • 熟悉常见错误及安全操作建议,确保数据传输安全可靠。

核心重点 ✅

类别 内容
命令含义 secure copy 安全复制
基本语法 scp [选项] 源路径 目标路径
核心功能 - 本地到远程复制
- 远程到本地复制
- 远程到远程复制
常用参数 -P, -r, -C, -i, -v
依赖服务 SSH 协议(需目标主机运行 sshd)
权限控制 受 SSH 用户权限限制,普通用户不能访问 /root

详细讲解 💡

1. 基本介绍 📘

📌 功能:

scpsecure 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 statusfirewall-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 等命令配合使用,形成完整的远程文件管理流程。

posted @ 2025-06-19 21:18  红尘过客2022  阅读(277)  评论(0)    收藏  举报