通过SSH复制文件:SCP、rsync和SFTP完整指南
SSH (Secure Shell) 是安全远程服务器管理的基础。无论您是部署代码的开发人员、管理基础设施的系统管理员,还是维护 VPS Hosting 环境的高级用户,在机器之间安全传输文件是您将经常执行的任务。
本综合指南涵盖了通过 SSH 复制文件的所有主要方法——包括 SCP、rsync、SFTP 和基于密钥的自动化——提供真实的语法、实际示例和专家提示,帮助您更快速、更安全地工作。
为什么使用 SSH 进行文件传输?

在深入了解这些工具之前,值得理解为什么基于 SSH 的文件传输是服务器管理员和开发人员的行业标准。
- 端到端加密:每一字节的数据——包括凭证、命令和文件内容——都使用现代密码算法在传输中加密。这使得 SSH 传输免受数据包嗅探和中间人攻击。
- 无需额外软件:SSH 预装在几乎所有 Linux/Unix 系统上,并在 Windows 10+ 和 macOS 上原生可用。
- 多功能性:单个 SSH 连接可以处理交互式 shell 会话、文件传输、端口转发和自动化脚本。
- 自动化友好:SSH 与 cron 作业、CI/CD 管道和备份脚本无缝集成,实现完全自动化的无密码文件传输。
- 可靠性:SSH 连接可以优雅地处理网络中断,特别是与 rsync 等工具结合使用时。
方法 1:使用 SCP(安全复制协议)复制文件

SCP 是通过 SSH 进行一次性文件传输最简单和最广泛使用的工具。它通过利用现有的 SSH 连接在主机之间安全地复制文件。
1) 基本 SCP 语法
scp [options] [source] [destination]2) 从本地机器上传文件到远程服务器
scp /path/to/local/file username@remote_host:/path/to/remote/destination详细说明:
| /path/to/local/file | 你想在本地机器上传输的文件 |
| username@remote_host | 你的 SSH 用户名和服务器的主机名或 IP 地址 |
| /path/to/remote/destination | 远程服务器上的目标目录或文件路径 |
3) 从远程服务器下载文件到本地机器
scp username@remote_host:/path/to/remote/file /path/to/local/destination只需反转源和目标即可从服务器拉取文件到本地机器。
4) 递归复制整个目录
scp -r /path/to/local/directory username@remote_host:/path/to/remote/destination-r 标志告诉 SCP 递归复制目录及其所有内容,包括嵌套的子目录。
5) 有用的 SCP 选项
| 选项 | 描述 |
|---|---|
| -P [port] | 指定自定义 SSH 端口(注意:大写 -P,不同于 SSH 的小写 -p) |
| -C | 启用压缩以在慢速连接上加快传输速度 |
| -i [identity_file] | 使用特定的 SSH 私钥进行身份验证 |
| -l [limit] | 限制带宽使用量(单位:Kbit/s) |
| -q | 安静模式 — 抑制进度输出 |
| -v | 详细模式 — 用于调试连接问题 |
6) 何时使用 SCP
SCP 非常适合快速的一次性文件传输,其中简单性很重要。它不需要配置,在任何安装了 SSH 的系统上都可以开箱即用。但是,对于大型目录或重复传输,rsync 是一个明显更好的选择。
方法 2:使用 rsync 复制文件

rsync 是通过 SSH 进行文件同步和传输的专业选择。它的杀手级功能是增量传输:rsync 不是复制整个文件,而是分析源和目标,仅传输更改的部分。在处理大文件或经常更新的目录时,这可以节省大量时间和带宽。
1) 基本 rsync 语法
rsync [options] [source] [destination]2) 从本地机器上传文件到远程服务器
rsync -avz /path/to/local/file username@remote_host:/path/to/remote/destination3) 将整个目录同步到远程服务器
rsync -avz /path/to/local/directory/ username@remote_host:/path/to/remote/destination/重要:注意源目录后面的尾部斜杠 /。使用尾部斜杠时,rsync 复制目录的内容。没有尾部斜杠时,rsync 将目录本身作为目标的子目录复制。
4) 镜像目录(删除从源中删除的文件)
rsync -avz --delete /path/to/local/directory/ username@remote_host:/path/to/remote/destination/–delete 标志确保从源中删除的文件也从目标中删除,使两个位置完全同步。
5) 使用自定义 SSH 端口
rsync -avz -e "ssh -p 2222" /path/to/local/directory/ username@remote_host:/path/to/remote/destination/6) 有用的 rsync 选项
| 选项 | 描述 |
|---|---|
| -a | 归档模式:保留权限、时间戳、符号链接和所有权 |
| -v | 详细模式:在传输期间显示逐个文件的进度 |
| -z | 压缩:减少通过网络传输的数据 |
| –delete | 删除目标中不再存在于源中的文件 |
| –progress | 显示每个文件的实时进度 |
| –exclude | 排除特定文件或模式(例如 –exclude ‘*.log’) |
| -n 或 –dry-run | 模拟传输而不实际复制任何内容 |
| -e “ssh -p [port]” | 指定自定义 SSH 端口 |
| –bwlimit=[KB/s] | 限制传输速度以避免饱和您的连接 |
7) 何时使用 rsync
将 rsync 用于备份、部署和任何定期同步任务。在管理大型代码库、媒体库或 专用服务器上的数据库导出时,它特别强大,其中带宽效率和数据完整性至关重要。
方法 3:在两个远程服务器之间复制文件

SCP 和 rsync 都有一个鲜为人知但极其有用的功能,即能够直接在两个远程服务器之间传输文件——无需通过本地计算机路由数据。这在迁移服务器或在云实例之间同步数据时非常宝贵。
1) 使用 SCP 在两个远程服务器之间复制文件
scp username1@remote_host1:/path/to/file username2@remote_host2:/path/to/destination2) 使用 rsync 在两个远程服务器之间复制文件
rsync -avz username1@remote_host1:/path/to/source/ username2@remote_host2:/path/to/destination/注意:要使服务器到服务器的传输正常工作,源服务器必须能够建立到目标服务器的 SSH 连接。您可能需要在源服务器上配置 SSH 密钥或使用 SSH 代理转发(ssh -A)。
3) 通过 SSH 隧道进行服务器到服务器的传输(替代方法)
如果由于防火墙限制无法进行直接的服务器到服务器 SSH 连接,您可以使用 tar 和 ssh 通过本地计算机管道传输:
ssh username1@remote_host1 "tar czf - /path/to/source" | ssh username2@remote_host2 "tar xzf - -C /path/to/destination"这会将压缩存档从服务器 1 直接流式传输到服务器 2,通过您的本地终端会话。
方法 4:使用 SFTP (SSH 文件传输协议) 复制文件

SFTP 在加密的 SSH 连接上提供交互式、类似 FTP 的体验。与 SCP 不同(SCP 是单命令工具),SFTP 打开一个持久会话,您可以在其中交互式地浏览目录、上传、下载、重命名和删除文件。
1) 启动 SFTP 会话
sftp username@remote_host您将进入 SFTP 提示符 (sftp>),从中您可以运行以下命令:
2) 基本 SFTP 命令
| 命令 | 描述 |
|---|---|
| ls | 列出当前远程目录中的文件 |
| lls | 列出当前本地目录中的文件 |
| cd /remote/path | 更改远程目录 |
| lcd /local/path | 更改本地目录 |
| put /local/file /remote/destination | 将文件上传到远程服务器 |
| get /remote/file /local/destination | 从远程服务器下载文件 |
| mput *.txt | 上传与模式匹配的多个文件 |
| mget *.log | 下载与模式匹配的多个文件 |
| mkdir /remote/newdir | 在远程服务器上创建目录 |
| rm /remote/file | 删除远程服务器上的文件 |
| exit 或 quit | 关闭 SFTP 会话 |
3) 通过 SFTP 连接到自定义 SSH 端口
sftp -P 2222 username@remote_host4) 何时使用 SFTP
SFTP 最适合用于交互式文件管理会话 — 例如,当您需要浏览远程目录结构、有选择地下载日志文件或将配置文件上传到 Web 服务器时。许多 GUI 客户端(如 FileZilla、Cyberduck 和 WinSCP)使用 SFTP 作为其底层协议,使非技术用户也可以访问。
方法 5:使用 SSH 密钥身份验证自动化文件传输

每次文件传输都手动输入密码效率低下,且与自动化不兼容。SSH 密钥身份验证通过允许无密码、密码学安全的登录来解决这个问题 — 这是任何自动化备份或部署工作流的前提条件。
1) 生成 SSH 密钥对
在本地机器上运行:
ssh-keygen -t ed25519 -C "your_email@example.com"注意: ed25519 是现代推荐的算法。如果需要与较旧系统兼容,请使用 -t rsa -b 4096。
按照提示保存密钥(默认位置:~/.ssh/id_ed25519)并可选择设置密码短语以增加安全性。
2) 将公钥复制到远程服务器
ssh-copy-id username@remote_host这会将你的公钥附加到远程服务器上的 ~/.ssh/authorized_keys 文件。系统会最后一次提示你输入密码。
如果 ssh-copy-id 不可用,你可以手动执行:
cat ~/.ssh/id_ed25519.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"3) 测试无密码身份验证
ssh username@remote_host如果你连接时没有被提示输入密码,则基于密钥的身份验证工作正常。
4) 使用 Shell 脚本自动化传输
配置了无密码 SSH 后,你现在可以在 cron 作业或脚本中自动化文件传输:
#!/bin/bash
# Daily backup script
rsync -avz --delete /var/www/html/ username@backup_server:/backups/www/将此添加到你的 crontab(crontab -e)以每晚运行:
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1SSH 文件传输常见问题排查

即使是经验丰富的管理员也会遇到问题。以下是最常见的问题及其解决方案:
权限被拒绝 (publickey)
- 验证公钥是否正确添加到远程服务器的 ~/.ssh/authorized_keys
- 检查 ~/.ssh 的权限是否为 700,authorized_keys 的权限是否为 600
- 确认 SSH 守护进程允许密钥认证(/etc/ssh/sshd_config 中的 PubkeyAuthentication yes)
连接被拒绝
- 验证 SSH 服务是否正在运行:systemctl status sshd
- 检查是否使用了正确的端口
- 查看防火墙规则:ufw status 或 iptables -L
传输速度缓慢
- 启用压缩:在 SCP 中添加 -C 或在 rsync 中添加 -z
- 使用更快的加密方式:ssh -c aes128-ctr(在高延迟链接上速度更快但安全性较低)
- 对于大型传输,考虑使用 rsync 配合 –bwlimit 以避免网络饱和
主机密钥验证失败
- 远程服务器的 SSH 指纹已更改(可能表示存在安全问题或服务器重建)
- 删除旧密钥:ssh-keygen -R remote_host
- 重新连接并在接受新指纹之前验证它
选择正确的工具:SCP vs. rsync vs. SFTP

| 功能 | SCP | rsync | SFTP |
|---|---|---|---|
| 易用性 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| 增量传输 | ❌ | ✅ | ❌ |
| 目录同步 | ✅ (递归) | ✅ (使用 –delete) | ✅ (手动) |
| 交互模式 | ❌ | ❌ | ✅ |
| 自动化 | ✅ | ✅ | ✅ (使用脚本) |
| 带宽效率 | 低 | 高 | 低 |
| 最适合 | 快速一次性传输 | 备份和同步 | 交互式浏览 |
保护您的 SSH 文件传输:最佳实践

无论您使用哪种工具,请遵循以下安全最佳实践来保护您的服务器和数据:
- 禁用密码身份验证 — 仅使用 SSH 密钥,并在 /etc/ssh/sshd_config 中设置 PasswordAuthentication no
- 更改默认 SSH 端口 — 远离端口 22 可大幅减少自动暴力破解尝试
- 使用 fail2ban — 自动禁止重复身份验证失败的 IP
- 按 IP 限制 SSH 访问 — 使用防火墙规则或 AllowUsers 指令来限制谁可以连接
- 保持 SSH 更新 — 定期更新 OpenSSH 以修补已知漏洞
- 使用强密钥算法 — 优先选择 ed25519 或 rsa-4096 而不是较旧的较弱算法
- 保护您的网络应用程序 — 将 SSH 安全与 SSL 证书配对,以加密到您的网络服务的所有流量
常见问题

1) SCP 和 SFTP 有什么区别?
SCP 是一个非交互式命令行工具,专为快速、单命令文件传输而设计。SFTP 是一个交互式协议,允许您在基于会话的界面中浏览、管理、上传和下载文件。两者都使用 SSH 进行加密。
2) 我可以在没有 SSH 的情况下使用 rsync 吗?
可以——rsync 有自己的守护程序模式,可以在没有 SSH 的情况下运行,但安全性较低。对于任何面向互联网的传输,始终使用 SSH 上的 rsync(rsync -e ssh)。
3) 如果我的服务器使用非标准 SSH 端口,我如何传输文件?
使用 SCP 的 -P 标志(scp -P 2222)或 rsync 的 -e “ssh -p 2222” 选项。对于 SFTP,使用 sftp -P 2222。
4) SCP 已被弃用吗?
OpenSSH 开发人员指出 SCP 的底层协议存在局限性,并建议为新工作流使用 SFTP 或 rsync。但是,SCP 在几乎所有系统上仍然广泛可用且功能完整。
结论

掌握基于SSH的文件传输是任何管理服务器、部署应用程序或维护远程基础设施的人必备的技能。每种工具都有其用武之地:
- SCP 是快速、简单、一次性传输的首选
- rsync 对于备份、部署和大型数据集的高效同步是必不可少的
- SFTP 在需要浏览和即时管理文件的交互式会话中表现出色
将这些工具与SSH密钥身份验证和可靠的安全实践相结合,可以为您提供一个强大、自动化和安全的文件传输工作流,从单个共享虚拟主机账户扩展到独立服务器上的复杂多服务器架构。
如果您正在寻找一个可靠、高性能的托管环境来实践这些技能,请探索AlexHost的VPS托管计划——为需要完全root访问权限、SSD存储和企业级网络连接的开发人员和系统管理员而构建。
