注册
SCP 命令与跨主机文件传输实践指南
专栏/技术分享/ 文章详情 /

SCP 命令与跨主机文件传输实践指南

何处惹尘埃 2026/07/23 97 0 0
摘要

SCP 命令与跨主机文件传输实践指南

在日常运维和开发工作中,我们经常需要在不同服务器之间、本地与远程服务器之间传输文件。scp(Secure Copy)是基于 SSH 协议的安全文件传输命令,简单、可靠、加密,是运维人员的必备工具。本文结合我在实际工作中的跨虚拟机文件传输经历,详细介绍 scp 的使用方法、网络条件要求以及常见问题的处理。


一、SCP 是什么?

scp 是 OpenSSH 套件的一部分,利用 SSH 协议在主机之间安全地复制文件。它与 cp 类似,但支持跨网络传输,且传输过程加密,安全性高于 ftprcp


二、使用 SCP 所需的网络条件

scp 依赖 SSH 协议,因此必须满足以下网络条件:

条件 说明
网络互通 源主机和目标主机之间必须能够通过网络互相访问(IP 路由可达)
SSH 服务开启 目标主机必须运行 SSH 服务(通常是 sshd),并监听指定端口(默认 22)
防火墙允许 防火墙需要放行 SSH 端口(如 22 或自定义端口)的入站连接
认证信息 需要知道目标主机的用户名和密码(或配置 SSH 密钥免密登录)

关于网络类型:

  • 内网传输:通常速度快、延迟低,且无需公网带宽,是首选方式。
  • 外网传输:需要目标主机有公网 IP,且防火墙开放端口,速度受公网带宽限制。
  • 端口映射:如果主机位于 NAT 后方,可以通过路由器端口映射实现访问。

三、SCP 基本语法

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

其中,远程路径格式为:

[用户名@]主机IP[:端口]:/路径/文件名
  • 如果省略用户名,则使用当前本地用户名。
  • 如果端口不是默认 22,需要加 -P 参数指定。

四、常用选项

选项 说明
-P port 指定远程主机的 SSH 端口(注意是大写 P)
-r 递归复制目录
-v 显示详细过程,用于调试
-C 启用压缩传输,适合大文件
-p 保留文件属性(修改时间、权限等)
-i identity_file 使用指定的私钥文件进行认证

五、典型使用场景

5.1 从本地复制文件到远程主机

scp /local/file.txt username@remote_ip:/remote/dir/

指定端口:

scp -P 2222 /local/file.txt username@remote_ip:/remote/dir/

5.2 从远程主机复制文件到本地

scp username@remote_ip:/remote/file.txt /local/dir/

指定端口:

scp -P 2222 username@remote_ip:/remote/file.txt /local/dir/

5.3 复制目录(递归)

scp -r /local/dir username@remote_ip:/remote/dir

5.4 在两台远程主机之间直接传输(通过本地中转)

scp -P 2222 username1@host1:/file username2@host2:/dir

注意:此方式需要本地主机能够同时访问两台远程主机。

5.5 从 Mac 本地传输到 Linux 虚拟机

Mac 也是 Unix-like 系统,同样使用 scp 命令,用法与 Linux 完全一致。


六、实际操作记录(端口已脱敏)

场景描述

我有三台虚拟机:

  • 虚拟机 A(IP:10.36.41.11,SSH 端口:52**,用于正常运维)
  • 虚拟机 B(IP:10.36.41.11,SSH 端口:52**,用于临时测试)
  • 本地 Mac(作为操作机)

需要在它们之间传输 DM8 安装包、DMHS 安装包等大文件。

操作 1:从 Mac 上传文件到虚拟机 A(端口 52**)

scp -P 52** /Users/mac/Downloads/dm8.iso root@10.36.41.11:/home/dmdba/
  • -P 52**:指定虚拟机 A 的 SSH 端口
  • 输入 root 密码后,进度条显示传输完成

操作 2:从虚拟机 B 拉取文件到本地 Mac

scp -P 52** root@10.36.41.11:/mnt/nas/dmhs.bin /Users/mac/Downloads/

操作 3:在虚拟机 A 上从虚拟机 B 拉取文件(跨虚拟机传输)

# 在虚拟机 A 上执行 scp -P 52** root@10.36.41.11:/mnt/nas/dmdrs.rpm /home/dmdba/

这里的关键点是,两台虚拟机虽然 IP 相同但端口不同,通过 -P 区分。它们在同一内网,因此传输速度很快。

操作 4:将虚拟机 A 上的文件推送至虚拟机 B

# 在虚拟机 A 上执行 scp -P 52** /home/dmdba/dmdrs.rpm root@10.36.41.11:/mnt/nas/

遇到的问题与处理

  • 连接拒绝:检查目标 SSH 服务是否启动(systemctl status sshd
  • 权限被拒绝:确认用户名和密码正确,或检查 /etc/ssh/sshd_config 中的 PermitRootLogin 设置
  • 端口不通:检查防火墙规则(firewall-cmd --list-all),临时关闭防火墙测试
  • 大文件传输中断:可使用 rsync 支持断点续传,或者使用 screen 后台运行

七、实战踩坑:同内网畅通,换网络后却连不上?

7.1 问题现象

在公司内网环境下,使用 Mac 通过 scp -P 52** 连接公司虚拟机(IP:10.36.41.11),可以正常上传和下载文件。但出差入住酒店后,连接酒店 WiFi,执行同样的 scp 命令却始终报错:

ssh: connect to host 10.36.41.11 port 52**: Connection timed out

7.2 问题分析

根本原因在于网络环境发生了变化

对比项 公司内网 酒店网络
网络类型 企业局域网 公共 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 的数据包路由到公司内网,因此连接超时。

7.3 解决方案

方案一:使用 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 管理员协助开通临时访问通道。

7.4 如何快速判断问题类型?

症状 可能原因
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 的对比

特性 SCP RSYNC
适用场景 简单传输,一次性拷贝 目录同步,增量备份
断点续传 不支持 支持(--partial
增量传输 不支持 支持(只传差异部分)
保留权限 支持(-p 支持(-a
命令复杂度

对于大文件或频繁同步,推荐使用 rsync


九、安全建议

  1. 使用 SSH 密钥替代密码登录,提高自动化脚本的安全性。
  2. 限制端口暴露,仅对信任的 IP 开放 SSH 端口。
  3. 使用 -v 选项调试,但正式脚本中关闭详细输出。
  4. 避免使用 root 账户,创建专用运维用户进行传输。

十、总结

scp 命令是跨主机文件传输的利器,掌握它对于服务器运维至关重要。在实际操作中,重点注意以下几点:

  • 确认网络互通和防火墙规则
  • 正确指定端口(-P 是大写)
  • 路径格式要完整(用户名@IP:路径)
  • 大文件传输建议使用 rsyncscreen 后台运行

scp 能用的前提是网络可达。在公司内网中,本机和目标虚拟机在同一局域网,数据包可以直接到达;在酒店或外网环境中,本机位于一个完全不同的网络环境,无法直接访问公司内网的私有 IP。理解这一点后,遇到类似问题就不会再困惑。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服