在日常运维和开发工作中,我们经常需要在不同服务器之间、本地与远程服务器之间传输文件。scp(Secure Copy)是基于 SSH 协议的安全文件传输命令,简单、可靠、加密,是运维人员的必备工具。本文结合我在实际工作中的跨虚拟机文件传输经历,详细介绍 scp 的使用方法、网络条件要求以及常见问题的处理。
scp 是 OpenSSH 套件的一部分,利用 SSH 协议在主机之间安全地复制文件。它与 cp 类似,但支持跨网络传输,且传输过程加密,安全性高于 ftp 或 rcp。
scp 依赖 SSH 协议,因此必须满足以下网络条件:
| 条件 | 说明 |
|---|---|
| 网络互通 | 源主机和目标主机之间必须能够通过网络互相访问(IP 路由可达) |
| SSH 服务开启 | 目标主机必须运行 SSH 服务(通常是 sshd),并监听指定端口(默认 22) |
| 防火墙允许 | 防火墙需要放行 SSH 端口(如 22 或自定义端口)的入站连接 |
| 认证信息 | 需要知道目标主机的用户名和密码(或配置 SSH 密钥免密登录) |
关于网络类型:
scp [选项] 源路径 目标路径
其中,远程路径格式为:
[用户名@]主机IP[:端口]:/路径/文件名
-P 参数指定。| 选项 | 说明 |
|---|---|
-P port |
指定远程主机的 SSH 端口(注意是大写 P) |
-r |
递归复制目录 |
-v |
显示详细过程,用于调试 |
-C |
启用压缩传输,适合大文件 |
-p |
保留文件属性(修改时间、权限等) |
-i identity_file |
使用指定的私钥文件进行认证 |
scp /local/file.txt username@remote_ip:/remote/dir/
指定端口:
scp -P 2222 /local/file.txt username@remote_ip:/remote/dir/
scp username@remote_ip:/remote/file.txt /local/dir/
指定端口:
scp -P 2222 username@remote_ip:/remote/file.txt /local/dir/
scp -r /local/dir username@remote_ip:/remote/dir
scp -P 2222 username1@host1:/file username2@host2:/dir
注意:此方式需要本地主机能够同时访问两台远程主机。
Mac 也是 Unix-like 系统,同样使用 scp 命令,用法与 Linux 完全一致。
我有三台虚拟机:
需要在它们之间传输 DM8 安装包、DMHS 安装包等大文件。
scp -P 52** /Users/mac/Downloads/dm8.iso root@10.36.41.11:/home/dmdba/
-P 52**:指定虚拟机 A 的 SSH 端口scp -P 52** root@10.36.41.11:/mnt/nas/dmhs.bin /Users/mac/Downloads/
# 在虚拟机 A 上执行
scp -P 52** root@10.36.41.11:/mnt/nas/dmdrs.rpm /home/dmdba/
这里的关键点是,两台虚拟机虽然 IP 相同但端口不同,通过 -P 区分。它们在同一内网,因此传输速度很快。
# 在虚拟机 A 上执行
scp -P 52** /home/dmdba/dmdrs.rpm root@10.36.41.11:/mnt/nas/
systemctl status sshd)/etc/ssh/sshd_config 中的 PermitRootLogin 设置firewall-cmd --list-all),临时关闭防火墙测试rsync 支持断点续传,或者使用 screen 后台运行在公司内网环境下,使用 Mac 通过 scp -P 52** 连接公司虚拟机(IP:10.36.41.11),可以正常上传和下载文件。但出差入住酒店后,连接酒店 WiFi,执行同样的 scp 命令却始终报错:
ssh: connect to host 10.36.41.11 port 52**: Connection timed out
根本原因在于网络环境发生了变化:
| 对比项 | 公司内网 | 酒店网络 |
|---|---|---|
| 网络类型 | 企业局域网 | 公共 WiFi(NAT) |
| IP 地址 | 10.x.x.x(私有地址) | 酒店分配的 192.168.x.x 或 172.x.x.x |
| 与目标虚拟机是否同网段 | 是(10.x.x.x/8) | 否 |
| 目标虚拟机是否可达 | 直接可达 | 不可达 |
| 路由器是否允许访问内网地址 | 允许 | 通常禁止 |
10.36.41.11 是公司内网的私有 IP 地址。在公司内网时,Mac 与虚拟机处于同一个局域网,网络直接可达。但酒店网络是一个独立的局域网,酒店路由器不会将发往 10.x.x.x 的数据包路由到公司内网,因此连接超时。
方案一:使用 VPN(推荐)
通过 VPN 连接公司内网,让 Mac 获得公司内网的虚拟 IP,从而能够访问内网资源。
# 连接 VPN 后,再执行 scp
scp -P 52** root@10.36.41.11:/remote/file /local/dir/
方案二:内网穿透(如 frp、SSH 隧道)
如果公司有公网跳板机,可以通过 SSH 隧道或 frp 将内网端口映射到公网。
# 通过跳板机中转(ProxyJump)
scp -o ProxyJump=user@jump_host -P 52** root@10.36.41.11:/remote/file /local/dir/
方案三:上传到云存储中转
将文件先上传到云存储(如 OSS、S3),再从目标虚拟机下载。
方案四:联系 IT 管理员
如果以上方案都不可行,联系 IT 管理员协助开通临时访问通道。
| 症状 | 可能原因 |
|---|---|
Connection timed out |
网络不通(防火墙、路由、跨网段) |
Connection refused |
目标端口未监听或 SSH 服务未启动 |
Permission denied |
用户名或密码错误 |
Host key verification failed |
目标主机公钥变更 |
如果出现 Connection timed out,首先检查是否与目标主机在同一内网。最简单的方法是用 ping 10.36.41.11 测试,如果不通,说明网络路由有问题。
本人的踩坑经历,原文链接:https://eco.dameng.com/community/post/202607130942005C3T1R1P56IVW6SGE5
| 特性 | SCP | RSYNC |
|---|---|---|
| 适用场景 | 简单传输,一次性拷贝 | 目录同步,增量备份 |
| 断点续传 | 不支持 | 支持(--partial) |
| 增量传输 | 不支持 | 支持(只传差异部分) |
| 保留权限 | 支持(-p) |
支持(-a) |
| 命令复杂度 | 低 | 中 |
对于大文件或频繁同步,推荐使用 rsync。
-v 选项调试,但正式脚本中关闭详细输出。scp 命令是跨主机文件传输的利器,掌握它对于服务器运维至关重要。在实际操作中,重点注意以下几点:
-P 是大写)rsync 或 screen 后台运行scp 能用的前提是网络可达。在公司内网中,本机和目标虚拟机在同一局域网,数据包可以直接到达;在酒店或外网环境中,本机位于一个完全不同的网络环境,无法直接访问公司内网的私有 IP。理解这一点后,遇到类似问题就不会再困惑。
文章
阅读量
获赞
