Linux scp 命令(建议收藏)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言

在 Linux 系统的日常操作中,文件传输是一项基础但至关重要的任务。无论是从本地计算机向远程服务器上传代码,还是在两台服务器之间同步数据,Linux scp 命令都是开发者和运维人员最常使用的工具之一。它基于 SSH 协议,通过加密通道实现安全可靠的文件传输。本文将从零开始讲解 scp 命令的核心用法,结合实例和进阶技巧,帮助读者快速掌握这一工具。


一、scp 命令的基础语法与核心概念

1.1 命令结构与角色定位

scp(Secure Copy) 的核心语法可以概括为:

scp [选项] 源文件路径 目标文件路径  

这里的“源”和“目标”可以是本地路径或远程路径。根据路径的不同组合,scp 可以实现以下三种典型场景:

  1. 本地到远程(上传):将本地文件发送到远程服务器。
  2. 远程到本地(下载):从远程服务器拉取文件到本地。
  3. 远程到远程:在两台服务器之间直接传输文件,无需经过本地中转。

类比理解:快递员的“三段式路线”

想象 scp 是一位“智能快递员”:

  • 当你从本地向远程发送文件时,它会直接将包裹(文件)从你的办公桌(本地路径)快递到目标服务器(远程路径)。
  • 当两台服务器之间传输时,它会像接力赛选手一样,先从 A 服务器取件,再送往 B 服务器,全程无需经过你的本地电脑。

1.2 路径格式规范

远程路径的书写格式为:

用户名@主机地址:路径  

例如:

  • user@192.168.1.100:/home/user/file.txt 表示远程服务器的 IP 地址为 192.168.1.100,用户名为 user,目标路径是 /home/user/file.txt

注意事项:

  • 如果省略用户名,默认使用当前本地用户的 SSH 登录名。
  • 如果省略主机地址前的路径(如 user@host:file.txt),则路径默认为远程用户的家目录(/home/user/)。

二、基础场景实战演练

2.1 场景一:本地到远程传输(上传)

案例:将本地的 report.pdf 文件上传到远程服务器的 /var/www/html/ 目录。

scp report.pdf user@192.168.1.100:/var/www/html/  

关键点解析:

  • 执行命令后,系统会要求输入远程用户的密码(或 SSH 密钥的 passphrase)。
  • 若目标路径末尾不加斜杠 /,文件将直接被命名为 html/report.pdf(以路径最后一部分为文件名)。

2.2 场景二:远程到本地传输(下载)

案例:从远程服务器下载 /data/logs/access.log 到本地当前目录。

scp user@192.168.1.100:/data/logs/access.log ./  

提示:

  • ./ 表示本地当前目录,确保文件不会因路径错误而丢失。
  • 如果远程路径中的文件名包含空格,需用引号包裹路径,例如:
    scp user@host:"/path/to/file with space.txt" ./  
    

2.3 场景三:远程到远程传输

案例:将远程服务器 A 的 /backup/db.sql 文件传输到服务器 B 的 /incoming/ 目录。

scp userA@serverA:/backup/db.sql userB@serverB:/incoming/  

优势分析:

  • 直接在服务器间传输,避免本地带宽占用。
  • 需确保本地机器能同时访问两台远程服务器的 SSH 端口(默认 22)。

三、进阶功能与实用技巧

3.1 递归传输目录(-r 选项)

当需要传输整个目录时,必须添加 -r(递归)选项:

scp -r project_folder user@remote:/srv/  

比喻解释:

  • 将目录视为“文件夹”,递归选项就像快递员“打包所有子文件夹和文件”,而非只搬运文件夹外壳。

3.2 指定 SSH 端口(-P 选项)

如果远程服务器的 SSH 端口非默认的 22,需使用 -P 参数(注意大写):

scp -P 2222 report.pdf user@192.168.1.100:/remote/path  

3.3 压缩传输(-C 选项)

通过 -C 开启压缩,可显著减少传输时间(尤其对文本文件有效):

scp -C -r large_logs/ user@server:/archive/  

数据对比:

文件类型原始大小压缩后大小传输时间节约
文本日志(.log)100MB25MB约 50%
图像(.jpg)80MB78MB几乎无变化

3.4 静默模式(-q 选项)

使用 -q 关闭进度提示,适合脚本自动化:

scp -q config.ini user@server:/etc/  

四、常见问题与解决方案

4.1 权限不足(Permission denied)

现象:出现类似 Permission denied (publickey)Permission denied, please try again 的报错。
可能原因

  • 远程服务器的 SSH 服务未开启。
  • 用户名或密码错误。
  • 密钥认证配置不正确(如缺少公钥)。
    解决方案
  1. 检查远程服务器的 SSH 端口是否开放(sudo systemctl status sshd)。
  2. 确认用户名和密码正确,或尝试使用密钥登录:
    scp -i ~/.ssh/id_rsa file.txt user@host:~  
    

4.2 文件传输中断后如何续传?

传统方案

  • 直接重传文件,但会覆盖已传输部分。
    改进方法
    使用 rsync 命令(结合 -P 参数支持续传和进度显示):
rsync -avz -e ssh --progress file.txt user@host:/remote/path  

4.3 防火墙或网络限制

现象:连接超时或无法建立 SSH 通道。
排查步骤

  1. 在本地执行 ping 192.168.1.100 检查基础网络连通性。
  2. 远程执行 sudo ufw statusiptables -L 查看防火墙规则,确保 SSH 端口开放。

五、高级用法与最佳实践

5.1 通过跳板机传输(Proxy Jump)

在无法直接访问目标服务器时,可借助跳板机:

scp -o ProxyJump=user@gateway.example.com file.txt target.example.com:~  

场景示例:

公司内网服务器 A 只允许从堡垒机 B 访问,此时通过 -o ProxyJump 实现间接传输。


5.2 传输多个文件或模式匹配

批量传输多个文件

scp file1.txt file2.jpg user@host:/docs/  

使用通配符匹配文件

scp *.csv user@remote:/data/  # 传输当前目录下所有 .csv 文件  

5.3 统计传输速度与时间

通过 pv 工具(需提前安装)监控进度:

scp $(pv report.pdf) user@host:/backup/  

输出示例:

report.pdf:  3.4GiB 0:03:42 [15.1MiB/s] [====>            ]  23% ETA 02:09  

六、实际案例:部署 Web 项目到服务器

案例背景:

开发者需将本地开发的网站代码(包含 index.htmlcss/js/ 目录)部署到远程服务器的 /var/www/website/

步骤分解:

  1. 上传主文件
    scp index.html user@server:/var/www/website/  
    
  2. 上传 CSS 和 JS 目录
    scp -r css/ js/ user@server:/var/www/website/  
    
  3. 验证文件完整性
    ssh user@server "ls -l /var/www/website/"  
    

扩展优化:

  • 使用 -C 压缩选项加速传输:
    scp -r -C css/ js/ user@server:/var/www/website/  
    

结论

Linux scp 命令凭借其简洁性与安全性,成为开发者日常工作的得力工具。通过掌握基础语法、进阶选项及常见问题的解决方法,用户能够高效完成文件传输任务。无论是小型项目的部署,还是服务器间的批量数据同步,scp 都能提供可靠的支持。随着对 SSH 密钥认证、防火墙配置等关联知识的深入,读者将进一步提升在 Linux 环境下的操作能力。

延伸学习建议

  • 熟悉 rsync 命令以实现更灵活的增量传输。
  • 探索 sshpass 工具实现无交互式 scp 脚本。
  • 学习 scptar 的结合使用,优化大文件传输效率。

通过持续实践与场景化应用,开发者将逐步解锁 scp 的全部潜力,成为 Linux 文件管理的“效率专家”。

最新发布