Linux scp 命令(建议收藏)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
前言
在 Linux 系统的日常操作中,文件传输是一项基础但至关重要的任务。无论是从本地计算机向远程服务器上传代码,还是在两台服务器之间同步数据,Linux scp 命令都是开发者和运维人员最常使用的工具之一。它基于 SSH 协议,通过加密通道实现安全可靠的文件传输。本文将从零开始讲解 scp 命令的核心用法,结合实例和进阶技巧,帮助读者快速掌握这一工具。
一、scp 命令的基础语法与核心概念
1.1 命令结构与角色定位
scp(Secure Copy) 的核心语法可以概括为:
scp [选项] 源文件路径 目标文件路径
这里的“源”和“目标”可以是本地路径或远程路径。根据路径的不同组合,scp 可以实现以下三种典型场景:
- 本地到远程(上传):将本地文件发送到远程服务器。
- 远程到本地(下载):从远程服务器拉取文件到本地。
- 远程到远程:在两台服务器之间直接传输文件,无需经过本地中转。
类比理解:快递员的“三段式路线”
想象 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) | 100MB | 25MB | 约 50% |
图像(.jpg) | 80MB | 78MB | 几乎无变化 |
3.4 静默模式(-q 选项)
使用 -q
关闭进度提示,适合脚本自动化:
scp -q config.ini user@server:/etc/
四、常见问题与解决方案
4.1 权限不足(Permission denied)
现象:出现类似 Permission denied (publickey)
或 Permission denied, please try again
的报错。
可能原因:
- 远程服务器的 SSH 服务未开启。
- 用户名或密码错误。
- 密钥认证配置不正确(如缺少公钥)。
解决方案:
- 检查远程服务器的 SSH 端口是否开放(
sudo systemctl status sshd
)。 - 确认用户名和密码正确,或尝试使用密钥登录:
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 通道。
排查步骤:
- 在本地执行
ping 192.168.1.100
检查基础网络连通性。 - 远程执行
sudo ufw status
或iptables -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.html
、css/
和 js/
目录)部署到远程服务器的 /var/www/website/
。
步骤分解:
- 上传主文件:
scp index.html user@server:/var/www/website/
- 上传 CSS 和 JS 目录:
scp -r css/ js/ user@server:/var/www/website/
- 验证文件完整性:
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 脚本。 - 学习
scp
与tar
的结合使用,优化大文件传输效率。
通过持续实践与场景化应用,开发者将逐步解锁 scp 的全部潜力,成为 Linux 文件管理的“效率专家”。