通过SSH复制文件:SCP、rsync和SFTP完整指南
SSH(安全外壳协议)是安全远程服务器管理的核心基础。无论您是部署代码的开发者、管理基础设施的系统管理员,还是维护 VPS Hosting 环境的高级用户,在机器之间安全传输文件都是您需要频繁执行的任务。
本综合指南涵盖了通过 SSH 复制文件的所有主要方法——包括 SCP、rsync、SFTP 以及基于密钥的自动化——配有真实语法、实用示例和专家技巧,帮助您更快、更安全地工作。
为什么使用 SSH 进行文件传输?
在深入了解工具之前,有必要先理解为什么基于 SSH 的文件传输是服务器管理员和开发者的行业标准。
- 端到端加密:每一字节的数据——包括凭据、命令和文件内容——在传输过程中均使用现代密码算法加密。这使 SSH 传输能够抵御数据包嗅探和中间人攻击。
- 无需额外软件:SSH 几乎预装在每个 Linux/Unix 系统上,并在 Windows 10+ 和 macOS 上原生可用。
- 多功能性:单个 SSH 连接可以处理交互式 Shell 会话、文件传输、端口转发和自动化脚本。
- 自动化友好:SSH 与 cron 任务、CI/CD 流水线和备份脚本无缝集成,支持完全自动化的无密码文件传输。
- 可靠性:SSH 连接能够优雅地处理网络中断,尤其是与
rsync等工具结合使用时。
方法一:使用 SCP(安全复制协议)复制文件
SCP 是最简单、最广泛使用的一次性文件传输工具,通过 SSH 进行传输。它利用现有的 SSH 连接在主机之间安全地复制文件。
SCP 基本语法
scp [options] [source] [destination]示例一:从本地机器上传文件到远程服务器
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 — 远程服务器上的目标目录或文件路径
示例二:从远程服务器下载文件到本地机器
scp username@remote_host:/path/to/remote/file /path/to/local/destination
只需交换源和目标,即可将文件从服务器拉取到本地机器。
示例三:递归复制整个目录
scp -r /path/to/local/directory username@remote_host:/path/to/remote/destination
-r 标志指示 SCP 递归复制目录及其所有内容,包括嵌套子目录。
常用 SCP 选项
选项
描述
-P [port]
指定自定义 SSH 端口(注意:大写 -P,与 SSH 的小写 -p 不同)
-C
启用压缩,加快慢速连接上的传输速度
-i [identity_file]
使用指定的 SSH 私钥进行身份验证
-l [limit]
限制带宽使用(单位:Kbit/s)
-q
静默模式——抑制进度输出
-v
详细模式——用于调试连接问题
何时使用 SCP
SCP 非常适合快速的一次性文件传输,简单易用。它无需任何配置,在任何安装了 SSH 的系统上开箱即用。但对于大型目录或重复传输,rsync 是明显更好的选择。
方法二:使用 rsync 复制文件
rsync 是专业人士通过 SSH 进行文件同步和传输的首选工具。其核心特性是增量传输:rsync 不会复制整个文件,而是分析源和目标,仅传输已更改的部分。在处理频繁更新的大文件或目录时,这可以节省大量时间和带宽。
rsync 基本语法
rsync [options] [source] [destination]
示例一:从本地机器上传文件到远程服务器
rsync -avz /path/to/local/file username@remote_host:/path/to/remote/destination
示例二:将整个目录同步到远程服务器
rsync -avz /path/to/local/directory/ username@remote_host:/path/to/remote/destination/
> 重要提示:注意源目录后面的斜杠 /。带有斜杠时,rsync 复制目录的*内容*;不带斜杠时,rsync 将目录本身作为目标的子目录进行复制。
示例三:镜像目录(删除源中已移除的文件)
rsync -avz --delete /path/to/local/directory/ username@remote_host:/path/to/remote/destination/
--delete 标志确保从源中删除的文件也会从目标中移除,使两个位置保持完全同步。
示例四:使用自定义 SSH 端口
rsync -avz -e "ssh -p 2222" /path/to/local/directory/ username@remote_host:/path/to/remote/destination/
常用 rsync 选项
选项
描述
-a
归档模式:保留权限、时间戳、符号链接和所有权
-v
详细模式:在传输过程中逐文件显示进度
-z
压缩:减少通过网络传输的数据量
--delete
删除目标中源已不存在的文件
--progress
显示每个文件的实时进度
--exclude
排除特定文件或模式(例如 --exclude '*.log')
-n 或 --dry-run
模拟传输而不实际复制任何内容
-e "ssh -p [port]"
指定自定义 SSH 端口
--bwlimit=[KB/s]
限制传输速度,避免占满连接带宽
何时使用 rsync
将 rsync 用于备份、部署以及任何定期同步任务。在管理 Dedicated Server 上的大型代码库、媒体库或数据库导出时,它尤为强大,因为带宽效率和数据完整性至关重要。
方法三:在两台远程服务器之间复制文件
SCP 和 rsync 都有一个鲜为人知但极为实用的功能,即能够直接在两台远程服务器之间传输文件——无需通过本地机器路由数据。这在迁移服务器或同步云实例之间的数据时非常宝贵。
使用 SCP 在两台远程服务器之间复制文件
scp username1@remote_host1:/path/to/file username2@remote_host2:/path/to/destination
使用 rsync 在两台远程服务器之间复制文件
rsync -avz username1@remote_host1:/path/to/source/ username2@remote_host2:/path/to/destination/
> 注意:要使服务器间传输正常工作,源服务器必须能够建立到目标服务器的 SSH 连接。您可能需要在源服务器上配置 SSH 密钥,或使用 SSH 代理转发(ssh -A)。
通过 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。
方法四:使用 SFTP(SSH 文件传输协议)复制文件
SFTP 通过加密的 SSH 连接提供类似 FTP 的交互式体验。与 SCP 这种单命令工具不同,SFTP 会打开一个持久会话,您可以在其中交互式地浏览目录、上传、下载、重命名和删除文件。
启动 SFTP 会话
sftp username@remote_host
您将进入 SFTP 提示符(sftp>),可以在其中运行以下命令:
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 会话
通过 SFTP 连接到自定义 SSH 端口
sftp -P 2222 username@remote_host
何时使用 SFTP
SFTP 最适合交互式文件管理会话——例如,当您需要浏览远程目录结构、有选择地下载日志文件或向 Web 服务器上传配置文件时。许多 GUI 客户端(如 FileZilla、Cyberduck 和 WinSCP)都使用 SFTP 作为底层协议,使非技术用户也能轻松使用。
方法五:使用 SSH 密钥认证自动化文件传输
每次文件传输都手动输入密码既低效,又与自动化不兼容。基于 SSH 密钥的认证通过允许无密码、加密安全的登录来解决这一问题——这是任何自动化备份或部署工作流的前提条件。
第一步:生成 SSH 密钥对
在您的本地机器上运行:
ssh-keygen -t ed25519 -C "your_email@example.com"
> 注意:ed25519 是现代推荐算法。如果需要与旧系统兼容,请使用 -t rsa -b 4096。
按照提示保存密钥(默认位置:~/.ssh/id_ed25519),并可选择设置密码短语以增强安全性。
第二步:将公钥复制到远程服务器
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"
第三步:测试无密码认证
ssh username@remote_host
如果连接时未提示输入密码,则基于密钥的认证已正常工作。
第四步:使用 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>&1
常见 SSH 文件传输问题排查
即使是经验丰富的管理员也会遇到问题。以下是最常见的问题及其解决方案:
权限被拒绝(publickey)
验证公钥是否已正确添加到远程服务器上的 ~/.ssh/authorized_keys~/.ssh 的权限是否为 700,authorized_keys 的权限是否为 600PubkeyAuthentication yes 在 /etc/ssh/sshd_config 中)连接被拒绝
- 验证 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,而非较旧、较弱的算法 - 保护您的 Web 应用程序——将 SSH 安全与 SSL Certificate 结合,加密所有 Web 服务流量
常见问题解答
SCP 和 SFTP 有什么区别?
SCP 是一种非交互式命令行工具,专为快速的单命令文件传输而设计。SFTP 是一种交互式协议,允许您在基于会话的界面中浏览、管理、上传和下载文件。两者都使用 SSH 进行加密。
我可以不使用 SSH 来使用 rsync 吗?
可以——rsync 有自己的守护进程模式,无需 SSH 即可运行,但安全性较低。对于任何面向互联网的传输,请始终通过 SSH 使用 rsync(rsync -e ssh)。
如果我的服务器使用非标准 SSH 端口,如何传输文件?
在 SCP 中使用 -P 标志(scp -P 2222),或在 rsync 中使用 -e "ssh -p 2222" 选项。对于 SFTP,使用 sftp -P 2222。
SCP 已被弃用了吗?
OpenSSH 开发者已指出 SCP 的底层协议存在局限性,并建议在新工作流中使用 SFTP 或 rsync。但 SCP 在几乎所有系统上仍然广泛可用且功能正常。
结论
掌握基于 SSH 的文件传输是任何管理服务器、部署应用程序或维护远程基础设施的人员的必备技能。每种工具都有其适用场景:
- SCP 是快速、简单的一次性传输的首选
- rsync 对于备份、部署以及大型数据集的高效同步不可或缺
- SFTP 在需要即时浏览和管理文件的交互式会话中表现出色
将这些工具与 SSH 密钥认证和可靠的安全实践相结合,可为您提供一个强大、自动化且安全的文件传输工作流,从单个 Shared Web Hosting 账户扩展到 Dedicated Servers 上的复杂多服务器架构。
如果您正在寻找可靠的高性能托管环境来实践这些技能,欢迎探索 AlexHost 的 VPS Hosting 方案——专为需要完整 root 访问权限、SSD 存储和企业级网络连接的开发者和系统管理员而构建。
