所有托管服务节省 15%

测试技能,享折扣

使用代码: Skills 开始使用
China
Linux 安全

通过SSH复制文件:SCP、rsync和SFTP完整指南

SSH (Secure Shell) 是安全远程服务器管理的基础。无论您是部署代码的开发人员、管理基础设施的系统管理员,还是维护 VPS Hosting 环境的高级用户,在机器之间安全传输文件是您将经常执行的任务。

本综合指南涵盖了通过 SSH 复制文件的所有主要方法——包括 SCP、rsync、SFTP 和基于密钥的自动化——提供真实的语法、实际示例和专家提示,帮助您更快速、更安全地工作。

为什么使用 SSH 进行文件传输?

disruptive

在深入了解这些工具之前,值得理解为什么基于 SSH 的文件传输是服务器管理员和开发人员的行业标准。

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

方法 1:使用 SCP(安全复制协议)复制文件

disruptive

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 复制文件

disruptive

rsync 是通过 SSH 进行文件同步和传输的专业选择。它的杀手级功能是增量传输:rsync 不是复制整个文件,而是分析源和目标,仅传输更改的部分。在处理大文件或经常更新的目录时,这可以节省大量时间和带宽。

1) 基本 rsync 语法

rsync [options] [source] [destination]

2) 从本地机器上传文件到远程服务器

rsync -avz /path/to/local/file username@remote_host:/path/to/remote/destination

3) 将整个目录同步到远程服务器

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:在两个远程服务器之间复制文件

disruptive

SCP 和 rsync 都有一个鲜为人知但极其有用的功能,即能够直接在两个远程服务器之间传输文件——无需通过本地计算机路由数据。这在迁移服务器或在云实例之间同步数据时非常宝贵。

1) 使用 SCP 在两个远程服务器之间复制文件

scp username1@remote_host1:/path/to/file username2@remote_host2:/path/to/destination

2) 使用 rsync 在两个远程服务器之间复制文件

rsync -avz username1@remote_host1:/path/to/source/ username2@remote_host2:/path/to/destination/

注意:要使服务器到服务器的传输正常工作,源服务器必须能够建立到目标服务器的 SSH 连接。您可能需要在源服务器上配置 SSH 密钥或使用 SSH 代理转发(ssh -A)。

3) 通过 SSH 隧道进行服务器到服务器的传输(替代方法)

如果由于防火墙限制无法进行直接的服务器到服务器 SSH 连接,您可以使用 tarssh 通过本地计算机管道传输:

ssh username1@remote_host1 "tar czf - /path/to/source" | ssh username2@remote_host2 "tar xzf - -C /path/to/destination"

这会将压缩存档从服务器 1 直接流式传输到服务器 2,通过您的本地终端会话。

方法 4:使用 SFTP (SSH 文件传输协议) 复制文件

disruptive

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删除远程服务器上的文件
exitquit关闭 SFTP 会话

3) 通过 SFTP 连接到自定义 SSH 端口

sftp -P 2222 username@remote_host

4) 何时使用 SFTP

SFTP 最适合用于交互式文件管理会话 — 例如,当您需要浏览远程目录结构、有选择地下载日志文件或将配置文件上传到 Web 服务器时。许多 GUI 客户端(如 FileZilla、Cyberduck 和 WinSCP)使用 SFTP 作为其底层协议,使非技术用户也可以访问。

方法 5:使用 SSH 密钥身份验证自动化文件传输

disruptive

每次文件传输都手动输入密码效率低下,且与自动化不兼容。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>&1

SSH 文件传输常见问题排查

disruptive

即使是经验丰富的管理员也会遇到问题。以下是最常见的问题及其解决方案:

权限被拒绝 (publickey)

  • 验证公钥是否正确添加到远程服务器的 ~/.ssh/authorized_keys
  • 检查 ~/.ssh 的权限是否为 700authorized_keys 的权限是否为 600
  • 确认 SSH 守护进程允许密钥认证(/etc/ssh/sshd_config 中的 PubkeyAuthentication yes

连接被拒绝

  • 验证 SSH 服务是否正在运行:systemctl status sshd
  • 检查是否使用了正确的端口
  • 查看防火墙规则:ufw statusiptables -L

传输速度缓慢

  • 启用压缩:在 SCP 中添加 -C 或在 rsync 中添加 -z
  • 使用更快的加密方式:ssh -c aes128-ctr(在高延迟链接上速度更快但安全性较低)
  • 对于大型传输,考虑使用 rsync 配合 –bwlimit 以避免网络饱和

主机密钥验证失败

  • 远程服务器的 SSH 指纹已更改(可能表示存在安全问题或服务器重建)
  • 删除旧密钥:ssh-keygen -R remote_host
  • 重新连接并在接受新指纹之前验证它

选择正确的工具:SCP vs. rsync vs. SFTP

disruptive

功能SCPrsyncSFTP
易用性⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
增量传输
目录同步✅ (递归)✅ (使用 –delete)✅ (手动)
交互模式
自动化✅ (使用脚本)
带宽效率
最适合快速一次性传输备份和同步交互式浏览

保护您的 SSH 文件传输:最佳实践

disruptive

无论您使用哪种工具,请遵循以下安全最佳实践来保护您的服务器和数据:

  1. 禁用密码身份验证 — 仅使用 SSH 密钥,并在 /etc/ssh/sshd_config 中设置 PasswordAuthentication no
  2. 更改默认 SSH 端口 — 远离端口 22 可大幅减少自动暴力破解尝试
  3. 使用 fail2ban — 自动禁止重复身份验证失败的 IP
  4. 按 IP 限制 SSH 访问 — 使用防火墙规则或 AllowUsers 指令来限制谁可以连接
  5. 保持 SSH 更新 — 定期更新 OpenSSH 以修补已知漏洞
  6. 使用强密钥算法 — 优先选择 ed25519rsa-4096 而不是较旧的较弱算法
  7. 保护您的网络应用程序 — 将 SSH 安全与 SSL 证书配对,以加密到您的网络服务的所有流量

常见问题

disruptive

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 在几乎所有系统上仍然广泛可用且功能完整。

结论

disruptive

掌握基于SSH的文件传输是任何管理服务器、部署应用程序或维护远程基础设施的人必备的技能。每种工具都有其用武之地:

  • SCP 是快速、简单、一次性传输的首选
  • rsync 对于备份、部署和大型数据集的高效同步是必不可少的
  • SFTP 在需要浏览和即时管理文件的交互式会话中表现出色

将这些工具与SSH密钥身份验证和可靠的安全实践相结合,可以为您提供一个强大、自动化和安全的文件传输工作流,从单个共享虚拟主机账户扩展到独立服务器上的复杂多服务器架构。

如果您正在寻找一个可靠、高性能的托管环境来实践这些技能,请探索AlexHost的VPS托管计划——为需要完全root访问权限、SSD存储和企业级网络连接的开发人员和系统管理员而构建。