通过sftp/scp/rsync向Linux实例传输文件

当需要从本地 Linux 或 macOS 系统向云服务器 ECS的 Linux 实例传输文件时,scp, sftp,rsync 是三种常用的命令行工具。选择和正确使用合适的工具,对于提升文件传输的效率、可靠性与安全性至关重要。本文旨在提供这三种工具的场景化使用指南和最佳实践,帮助用户应对从简单文件上传到大规模数据同步的需求。

工具介绍对比

在开始操作前,可根据具体场景选择最合适的工具。

  • 临时传输单个小文件或配置:推荐使用 scp,语法最简单,上手最快。

  • 需要交互式管理文件(如查看目录、删除、重命名):推荐使用 sftp,它提供一个类似 FTP 的交互式会话。

  • 大规模数据同步、定期备份、传输大量小文件:推荐使用 rsync,其增量同步算法效率最高。

  • 网络环境不稳定,传输大文件:推荐使用rsyncsftp 的断点续传功能。

下表提供了更详细的技术对比:

scp/ sftp/ rsync工具详细对比

特性维度

SCP

SFTP

Rsync

性能特征

大文件:性能良好。

大量小文件:效率低,因每个文件都可能涉及新的连接开销。

大文件:性能良好,支持流水线操作。

大量小文件:优于 scp,但仍不如 rsync

综合效率高。尤其在第二次及后续同步时,仅传输文件差异部分,可以节省带宽和时间。

断点续传

不支持。传输中断后必须从头开始。

支持。通过 reget (下载) 和 reput (上传) 命令对单个文件实现。

支持。通过 --partial--append-verify 参数,能续传文件和目录。

核心优势

语法简单,是系统默认自带的基础工具,适合一次性、临时性的传输任务。

提供交互式会话,可在远程服务器上直接进行文件管理操作(如 ls, rm, mkdir)。

增量同步。支持过滤、删除、限速、压缩等高级选项。

资源消耗

CPU 和内存消耗较低。

交互式会话会保持一个持续的 SSH 连接,资源消耗中等。

在对比文件差异时会消耗一定的 CPU 和内存,尤其在扫描海量文件时。

操作步骤

准备工作与前置检查

在执行文件传输前,请完成以下准备与检查工作。

  1. 获取实例的公网 IP 地址 本地向实例传输文件时,实例需开通公网。开通后可在 ECS 实例列表中记录目标实例的公网 IP 地址。后续所有命令都将使用此 IP。

  2. 配置安全组规则 文件传输依赖 SSH 协议,默认使用 22 端口。需确保实例所属的安全组已放行来自本地网络的访问请求。

    • 授权策略:允许

    • 协议类型:自定义 TCP

    • 端口范围22/22 (或您的自定义 SSH 端口)

    • 授权对象:为了安全,建议仅填写您的本地公网 IP 地址。

      可通过在本地终端执行 curl ifconfig.mecurl ip.sb 获取。
  3. 检查实例内部防火墙 除了安全组,实例操作系统内部的防火墙可能阻止连接。

    1. 登录实例,查看防火墙状态

    2. 若防火墙开启,参考开放指定端口或服务,需确保其已放行 SSH 服务或 22 端口。

方法一:使用 scp 传输文件

SCP(Secure Copy Protocol)用于在本地和远程主机之间进行简单的文件或目录复制。

上传文件或目录到实例

需要上传文件或文件夹到实例时,可以在本地执行以下命令,执行命令后,会提示您输入密码。

# 上传单个文件到实例
sudo scp <本地文件路径> <云服务器登录名>@<云服务器公网IP地址>:<云服务器文件目录>

# 上传本地目录到实例
sudo scp -r <本地目录> <云服务器登录名>@<云服务器公网IP地址>:<云服务器文件目录>

示例:

将本地的/opt/test.txt文件上传到公网IP1xx.xxx.xxx.121实例的/home/ecs-user/路径下,可通过以下命令实现:

sudo scp /opt/test.txt ecs-user@1xx.xxx.xxx.121:/home/ecs-user/

从实例下载文件或目录到本地

需要从实例下载文件到本地时,可以在本地执行以下命令,执行命令后,会提示您输入密码。

当传输大量小文件时,scp 效率较低。建议先将文件打包成单个压缩文件(如 .tar.gz)再传输,或改用 rsync
# 下载单个文件到本地
sudo scp <云服务器登录名>@<云服务器公网IP地址>:<云服务器文件路径> <本地目录>

# 下载实例目录到本地
sudo scp -r <云服务器登录名>@<云服务器公网IP地址>:<云服务器文件目录> <本地目录>

示例:

将公网IP1xx.xxx.xxx.121实例的/home/ecs-user/test.txt文件下载到本地的/opt/路径下,可通过以下命令实现:

sudo scp ecs-user@1xx.xxx.xxx.121:/home/ecs-user/test.txt /opt/

方法二:使用 sftp 进行交互式文件传输

SFTP(SSH File Transfer Protocol)提供一个交互式会话,允许在传输文件的同时进行远程文件管理。

连接到实例

在本地终端执行以下命令,建立 sftp 连接。连接成功后,终端提示符会变为 sftp>

sudo sftp <云服务器实例登录名>@<云服务器实例公网IP地址>

SFTP常用交互命令

sftp> 提示符下,可使用以下命令:

  • 远程操作ls (列出远程目录), cd (切换远程目录), pwd (显示远程当前路径), mkdir (创建远程目录), rm (删除远程文件), rename (重命名远程文件)。

  • 本地操作lls (列出本地目录), lcd (切换本地目录), lpwd (显示本地当前路径)。

上传文件或整个目录到实例

# 上传单个文件
sftp> put <本地文件路径> <云服务器文件目录>

# 上传整个目录
sftp> put -r <本地目录> <云服务器文件目录>

示例:

  • 将本机/opt/test.txt文件上传至实例的/home/ecs-user/目录下:

    sftp> put /opt/test.txt /home/ecs-user
  • 将本机/opt/test/目录上传至实例的/home/ecs-user/目录下:

    sftp> put -r /opt/test/ /home/ecs-user/

从实例下载文件或整个目录到本地

# 下载单个文件
sftp> get <云服务器文件路径> <本地目录>

# 下载整个目录
sftp> get -r <云服务器文件目录> <本地目录>

示例:

  • 将实例的/home/ecs-user/test.txt文件下载至本机的/opt目录下:

    sftp> get /home/ecs-user/test.txt /opt
  • 将实例的/home/ecs-user/test/目录下载至本地的/opt目录下:

    sftp> get -r /home/ecs-user/test/ /opt

断点续传

当大文件传输中断时,可使用 reget(上传) 和 reput(下载) 命令继续传输。

# 继续上传
sftp> reput <本地文件路径> <云服务器文件目录>

# 继续下载
sftp> reget <云服务器文件路径> <本地目录>
SFTP断点续传仅对单个文件有效。若传输整个目录时中断,建议退出后使用rsync进行高效同步。

断开连接

当完成传输任务后,可以通过quitbye命令退出 sftp 会话。

方法三:使用 rsync 高效同步文件和目录

rsync适用于大规模、增量或重复性的传输任务。

安装工具

确保本地和 ECS 实例上都已安装 rsync

# CentOS / Alibaba Cloud Linux
sudo yum install -y rsync

# Debian / Ubuntu
sudo apt-get update && sudo apt-get install -y rsync

常用参数

rsync 的标准用法通常包含 -avz 参数:

  • -a (archive): 归档模式,等同于 -rlptgoD,递归同步并保持文件所有属性(如权限、时间戳)。

  • -v (verbose): 显示详细的传输过程。

  • -z (compress): 在传输过程中压缩数据,可节省带宽。但在高带宽链路上,CPU 压缩可能成为瓶颈,不加 -z 反而更快。

生产环境常用参数

  • --delete: 使目标目录与源目录严格一致,会删除目标目录中多余的文件。

    重要

    删除为高危操作,使用前请务必确认

  • --exclude='PATTERN': 排除指定模式的文件或目录,如 --exclude='*.log'--exclude='node_modules/'

  • --bwlimit=KBPS: 限制传输带宽,单位为 KB/s。避免 rsync 占用全部网络带宽,影响其他服务。

  • --dry-run-n: 模拟运行。仅显示将要执行的操作而不实际传输。

    重要

    建议在执行包含 --delete 的命令前使用此参数进行检查

  • --partial: 支持断点续传。若传输中断,rsync 会保留未完成的文件,下次运行时可基于此继续传输。

上传/同步文件或目录到ECS实例

当需要上传文件到实例时,可以在本地执行以下命令,执行命令后,会提示您输入密码。

sudo rsync -avz -e ssh <本地文件或文件夹路径> <云服务器实例登录名>@<云服务器实例公网IP地址>:<实例目录>

示例:

  • /opt/test.txt文件上传至公网IP1xx.xxx.xxx.121实例的/home/ecs-user目录下,可使用以下命令:

    sudo rsync -avz -e ssh /opt/test.txt ecs-user@1xx.xxx.xxx.121:/home/ecs-user
  • 将本地/opt/test目录,与公网IP1xx.xxx.xxx.121实例的/home/ecs-user/test目录同步,可使用以下命令:

    sudo rsync -avz -e ssh /opt/test/ ecs-user@1xx.xxx.xxx.121:/home/ecs-user/test

从实例下载/同步文件或目录到本地

当需要从实例下载文件到本地时,可以在本地执行以下命令,执行命令后,会提示您输入密码。

sudo rsync -avz -e ssh <云服务器实例登录名>@<云服务器实例公网IP地址>:<实例文件或文件夹路径> <本地目录>

应用于生产环境

  • 传输海量小文件:先打包,再传输 对于包含数万甚至数百万小文件的目录,直接使用 scprsync 会因大量的连接和元数据开销而变得缓慢。可以先在源端打包压缩,传输单个大文件,然后在目标端解压。

  • 使用 SSH 配置文件简化命令 在本地 ~/.ssh/config 文件中为 ECS 实例设置别名(以my-prod-server为例),可以简化连接和传输命令。

    # 添加以下内容到 ~/.ssh/config
    Host my-prod-server
        HostName 118.178.x.x
        User ecs-user
        Port 22
        IdentityFile ~/.ssh/id_rsa_aliyun
        ServerAliveInterval 60

    配置后,命令将变得简洁,示例如下:

    # 原命令: 
    sudo scp -i ~/.ssh/id_rsa_aliyun local.txt ecs-user@118.178.x.x:/remote/
    # 现命令: 
    sudo scp local.txt my-prod-server:/remote/
    
    # 原命令: 
    sudo rsync -avz -e "ssh -i ~/.ssh/id_rsa_aliyun" local_dir/ ecs-user@...
    # 现命令: 
    sudo rsync -avz local_dir/ my-prod-server:/remote_dir/

常见问题

  • 如何通过指定端口传输文件?

    • SCP:通过-P参数指定端口,scp -P <端口> <具体命令>

    • SFTP:通过-P参数指定端口,sftp -P <端口> <具体命令>

    • Rsync:通过修改-e参数来指定端口,rsync -avz -e "ssh -p <SSH服务的端口>" <具体命令>

  • 如何在通过密钥对连接实例传输文件时指定私钥?

    • SCP:通过-i参数指定私钥文件,scp -i <私钥文件路径> <本地文件路径> <具体命令>

    • SFTP:通过-oIdentityFile参数指定私钥文件,sftp -oIdentityFile=<私钥文件路径> <具体命令>

    • Rsync:通过修改-e参数来指定端口,rsync -e "ssh -i <私钥文件路径>" <具体命令>

相关文档