15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
28.10.2024

通过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 的权限是否为 700authorized_keys 的权限是否为 600
  • 确认 SSH 守护进程允许密钥认证(PubkeyAuthentication yes/etc/ssh/sshd_config 中)
  • 连接被拒绝

    • 验证 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

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

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

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

    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. 保护您的 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 存储和企业级网络连接的开发者和系统管理员而构建。

    15%

    全场主机优惠15%

    测试技能,享折扣

    使用代码:

    Skills
    开始使用