做运维的同事几乎都被"大文件传输"折腾过。常见场景:
这些场景的共同点是"文件大、距离远、对可靠性和速度有要求"。但很多同学一上来就用 scp 一把梭,结果发现:
scp 是最简单的方案,但不是最优方案。不同的传输场景需要不同的工具组合。本文基于常见的工程实践,讲解 Linux 下大文件传输的 5 类方案(rsync、scp、nc、tar+split+lftp、curl/aria2)、它们的适用场景、性能差异、可靠性措施和最佳实践。
本文适合以下读者和场景:
本文不涉及对象存储(S3 / OSS)的文件上传、BitTorrent 协议、P2P 协议、分布式文件系统等议题。
大文件传输的瓶颈通常不是网络带宽,而是:
大文件传输的可靠性要求:
加密能保证数据安全,但会消耗 CPU。在内网传输、专线路由、隔离网络等场景下,可以关闭加密换取速度。在公网传输、跨运营商等场景下,必须加密。
压缩能减少传输数据量,但会消耗 CPU。如果文件本身已经压缩过(zip、tar.gz、mp4),再压缩一次没效果。对于文本文件、数据库 dump、JSON 数据,压缩效果显著。
scp(Secure Copy Protocol)是最常见的文件传输工具,基于 SSH 协议,几乎所有 Linux 发行版自带。
# 基本用法scp /local/file user@remote:/remote/path/# 传目录scp -r /local/dir/ user@remote:/remote/path/# 指定端口scp -P 2222 /local/file user@remote:/remote/path/# 限速(KB/s)scp -l 8000 /local/file user@remote:/remote/path/# 保留文件属性scp -p /local/file user@remote:/remote/path/scp 在大多数发行版上调用的是 sftp 内部实现。OpenSSH 8.0 之后,scp 默认用 SFTP 协议(SFTP-over-SSH),而不是老的 SCP 协议。
scp -C 之外的断点续传,但默认未启用,需要 rsync 或 sftp。-C 加额外工具)。断了只能重传。# 1. 启用压缩(如果文件未压缩)scp -C /local/file user@remote:/remote/path/# 2. 选择加密算法(减少 CPU 消耗)scp -c aes128-ctr /local/file user@remote:/remote/path/# 3. 指定 IP 协议(IPv4 路径可能更短)scp -4 /local/file user@remote:/remote/path/# 4. 调大 SSH 加密缓冲区# 编辑 /etc/ssh/ssh_config,添加:# Compression yes# CompressionLevel 9# 注意:高压缩级别耗 CPU风险提醒:
scp -r 复制目录时,如果源路径以 / 结尾,复制目录内容;不以 / 结尾,复制整个目录。scp user@remote:~/file /local/ 复制大文件到本地,避免本地磁盘被打满。scp 不适合生产环境的大文件传输、批量传输、跨地域传输。
rsync 是 Linux 下的文件同步工具,支持增量传输(只传变化的部分)、断点续传、压缩、保留权限等功能。
# 安装yum install rsync -y # CentOS / RHELapt install rsync -y # Ubuntu / Debian# 基本用法rsync -avz /local/file user@remote:/remote/path/# 常用参数# -a 归档模式(保留权限、符号链接、时间戳等)# -v 详细输出# -z 传输时压缩# -P 显示进度 + 支持断点续传(--partial --progress)# --bwlimit=KBps 限速# -e ssh 使用 SSH 协议rsync 最强大的特性是"增量传输"。它会把文件分成小块(chunk),对每块计算校验和,只传校验和不同的块。这在以下场景极其有用:
# 增量同步(默认行为)rsync -avz /local/dir/ user@remote:/remote/dir/# 第一次传完整文件# 第二次开始只传变化的部分# 启用断点续传rsync -avzP /local/file user@remote:/remote/path/# -P 等价于 --partial --progress# --partial 保留部分传输的文件# --progress 显示进度断了之后再次执行同一条命令,会从断点继续。
# 限速 10MB/srsync -avz --bwlimit=10240 /local/file user@remote:/remote/path/# 限速 100Mbpsrsync -avz --bwlimit=12500 /local/file user@remote:/remote/path/--bwlimit 单位是 KBps(千字节 / 秒)。
# 排除特定文件rsync -avz --exclude='*.log' /local/dir/ user@remote:/remote/dir/# 排除多个rsync -avz --exclude={'*.log','*.tmp','cache/'} /local/dir/ user@remote:/remote/dir/# 用 --include 和 --exclude 组合rsync -avz --include='*.txt' --exclude='*' /local/dir/ user@remote:/remote/dir/rsync 可以以 daemon 模式运行,提供 873 端口的传输服务。生产环境常用的"rsync server"模式:
# 服务端配置 /etc/rsyncd.confuid = nobodygid = nobodyuse chroot = yesmax connections = 10pid file = /var/run/rsyncd.pidlog file = /var/log/rsyncd.logtransfer logging = yestimeout = 900[backup] path = /data/backup/ comment = backup arearead only = no auth users = backupuser secrets file = /etc/rsyncd.secrets hosts allow = 10.0.0.0/24 hosts deny = *# 客户端访问rsync -avz rsync://backupuser@<server>/backup/ /local/backup/# 1. 选择合适的块大小(默认 700,比较保守)rsync -avz --block-size=8192 /local/file user@remote:/remote/path/# 2. 关闭压缩(如果文件已压缩)rsync -av /local/file user@remote:/remote/path/# 3. 用更强的校验算法rsync -avz --checksum-choice=xxh128 /local/file user@remote:/remote/path/# OpenSSH 8.0+ 之后的版本支持# 4. 调整 IO 缓冲区rsync -avz --whole-file /local/file user@remote:/remote/path/# --whole-file 禁用增量算法(适合小文件)rsync over SSH 时,SSH 加密是瓶颈。优化方式:
# 1. 启用 SSH 压缩rsync -avz -e "ssh -C" /local/file user@remote:/remote/path/# 2. 指定 SSH 加密算法(减少 CPU 消耗)rsync -avz -e "ssh -c aes128-ctr" /local/file user@remote:/remote/path/# 3. 用 SSH ControlMaster 复用连接# 在 ~/.ssh/config 中添加:# Host *# ControlMaster auto# ControlPath /tmp/ssh-%r@%h:%p# ControlPersist 600# 4. SSH 启用加速算法rsync -avz -e "ssh -o 'Compression no'" /local/file user@remote:/remote/path/rsync 是生产环境最常用的文件同步工具,几乎是"增量传输"的事实标准。
nc(netcat)是 Linux 下的网络瑞士军刀,能在两台机器之间直接建立 TCP 连接。nc + tar 组合可以在不经过 SSH 加密的情况下传输文件,性能比 scp / rsync over SSH 高。
# 服务端(在目标机器上执行)nc -l 9999 > /remote/file.tar.gz# 客户端(在源机器上执行)tar czf - /local/dir/ | nc <server_ip> 9999或者反向:
# 客户端监听并解压nc -l 9999 | tar xzf - -C /local/path/# 服务端打包并发送tar czf - /remote/path/ | nc <client_ip> 9999nc 不做加密,CPU 消耗极小。适合内网、专线等可信环境。
nc 本质是"管道 + 网络",可以和各种流式工具组合:
# 传输整个磁盘镜像dd if=/dev/sda bs=4M | nc <server_ip> 9999# 在目标端恢复nc -l 9999 | dd of=/dev/sda bs=4M# 传输 LVM 快照lvcreate -s -n snap -L 10G /dev/vg0/datadd if=/dev/vg0/snap bs=4M | nc <server_ip> 9999# 客户端发送时压缩tar czf - /local/dir/ | nc <server_ip> 9999# 目标端接收时解压nc -l 9999 | tar xzf - -C /local/path/nc 本身不显示进度,但可以借助 pv(Pipe Viewer):
# 安装 pvyum install pv -yapt install pv -y# 客户端tar czf - /local/dir/ | pv -s $(du -sb /local/dir/ | awk '{print $1}') | nc <server_ip> 9999# 输出会显示进度条、速度、剩余时间# 方法 1:用 pvtar czf - /local/dir/ | pv -s 10G | nc <server_ip> 9999# 方法 2:用 dd 显示进度tar czf - /local/dir/ | dd bs=1M | pv | nc <server_ip> 9999# 方法 3:分块 + 总大小total_size=$(du -sb /local/dir/ | awk '{print $1}')tar czf - /local/dir/ | nc <server_ip> 9999 &nc_pid=$!# 监控网络流量估算进度whilekill -0 $nc_pid 2>/dev/null; do sleep 5echo"Current state:" ss -tan | grep ":9999"done如果需要加密,可以用 ncat(Nmap 套件)或者 cryptcat:
# 安装 nmap(含 ncat)yum install nmap -yapt install ncat -y# 用 ncat 加密传输ncat -l 9999 --ssl > /remote/file.tar.gztar czf - /local/dir/ | ncat <server_ip> 9999 --sslnc + tar 是单机之间最快的传输方案之一,但只适合可信环境。
大文件传输时,如果单文件太大(比如 100GB),可以用 split 切成小块分别传输,到目标端再合并。这样做有几个好处:
md5sum 验证每个块的完整性。# 打包并分卷(每个块 1GB)tar czf - /local/dir/ | split -b 1G - /backup/file_part_# 生成的文件:# /backup/file_part_aa# /backup/file_part_ab# /backup/file_part_ac# ...# 传完之后在目标端合并cat /backup/file_part_* | tar xzf - -C /local/path/# 校验完整性md5sum /backup/file_part_* > /backup/md5sums.txtmd5sum -c /backup/md5sums.txt# 按字节split -b 100M file.tar.gz file_part_# 按行(文本文件)split -l 10000 file.log file_part_# 用数字后缀(默认是字母)split -b 100M -d file.tar.gz file_part_# 加前缀split -b 100M file.tar.gz /backup/bigfile_part_# 用 parallel 并行传多个分卷ls /backup/file_part_* | xargs -n 1 -P 4 -I {} scp {} user@remote:/remote/backup/# 或者用 rsync 多线程# 注意:rsync 本身不支持多线程传输单文件,需要手动分包注意:单个文件的多线程传输可以用 psplit(Parallel Split)工具,但用得不多。常见做法是 split + parallel scp。
# 源端生成 MD5md5sum /backup/file_part_* > /backup/md5sums.txt# 传 md5sums.txt 到目标scp /backup/md5sums.txt user@remote:/remote/backup/# 目标端校验md5sum -c md5sums.txt# 用 rsync 传分卷(支持断点续传)for part in /backup/file_part_*; do rsync -avzP "$part" user@remote:/remote/backup/done# 传完合并cat /remote/backup/file_part_* | tar xzf - -C /local/path/curl / wget 是命令行下载工具,支持 HTTP / HTTPS / FTP / SFTP / SCP 等多种协议。aria2 是更强的多线程下载工具。
# 用 curl 从 HTTP 服务下载curl -O http://example.com/file.tar.gz# 断点续传curl -C - -O http://example.com/file.tar.gz# 显示进度条curl --progress-bar -O http://example.com/file.tar.gz# 后台下载curl -O -# http://example.com/file.tar.gz &# 用 wgetwget http://example.com/file.tar.gz# wget 断点续传wget -c http://example.com/file.tar.gzcurl 和 wget 都可以从 HTTP / FTP 服务下载。生产环境如果需要传大文件,可以在目标端起一个 HTTP 服务(比如 python -m http.server),源端用 curl 下载。
aria2 是支持多线程、多协议的分段下载工具。
# 安装yum install aria2 -yapt install aria2 -y# 16 线程下载aria2c -x 16 http://example.com/file.tar.gz# 断点续传aria2c -c -x 16 http://example.com/file.tar.gz# 从多个源下载同一文件(多源提速)aria2c -x 4 http://server1/file.tar.gz http://server2/file.tar.gz http://server3/file.tar.gz# BT 下载aria2c file.torrentaria2 的多线程下载是把一个文件分成多段,并行从服务器拉取。如果服务器限制了单连接带宽,多线程能突破这个限制。
# 目标端起一个简单的 HTTP 服务cd /data/backup/python3 -m http.server 8080# 或者python -m SimpleHTTPServer 8080 # Python 2# 源端下载curl -O http://<server_ip>:8080/file.tar.gzwget http://<server_ip>:8080/file.tar.gz风险提醒:python -m http.server 是单线程的,并发性能差。生产环境推荐用 Nginx 起一个下载服务。
# Nginx 配置server { listen 8080; location /download/ { alias /data/backup/; autoindex on; # 启用目录列表 sendfile on; # 启用零拷贝 tcp_nopush on; # 合并 TCP 包 charset utf-8; }}# curl 限速curl --limit-rate 10M -O http://example.com/file.tar.gz# wget 限速wget --limit-rate=10m http://example.com/file.tar.gz# aria2 限速aria2c --max-download-limit=10M http://example.com/file.tar.gz# wget 后台下载wget -b http://example.com/file.tar.gz# curl 不直接支持后台,可以配合 nohupnohup curl -O http://example.com/file.tar.gz > /tmp/curl.log 2>&1 &# aria2 后台(aria2c 默认是后台的,输出到终端)aria2c -d /data/ http://example.com/file.tar.gz在同一台千兆内网机器上,传输 10GB 压缩文件:
注意:实际速度受磁盘 I/O、CPU 性能、网络拥塞、文件压缩比等因素影响。测试值仅供参考。
无论用哪个工具,传输性能都受网络参数影响。优化内核参数:
# /etc/sysctl.d/99-network-tuning.conf# TCP 缓冲区net.core.rmem_default = 262144net.core.wmem_default = 262144net.core.rmem_max = 16777216net.core.wmem_max = 16777216net.ipv4.tcp_rmem = 4096 87380 16777216net.ipv4.tcp_wmem = 4096 65536 16777216# TCP 拥塞控制(推荐 BBR)net.ipv4.tcp_congestion_control = bbrnet.core.default_qdisc = fq# 队列net.core.somaxconn = 65535net.core.netdev_max_backlog = 65535net.ipv4.tcp_max_syn_backlog = 65535# 临时端口net.ipv4.ip_local_port_range = 1024 65535应用配置:
sysctl -p /etc/sysctl.d/99-network-tuning.conf大文件传输的另一瓶颈是磁盘 I/O。优化方法:
# 1. 用 ionice 调整 I/O 优先级ionice -c2 -n0 tar czf - /local/dir/ | nc <server_ip> 9999# -c2 best-effort# -n0 最高优先级# 2. 用 dd 设置大块读取tar czf - /local/dir/ | dd bs=4M | nc <server_ip> 9999# 3. 选择合适的文件系统# 大文件传输用 XFS 或 ext4 都行,XFS 在大文件场景下表现略好# 4. 调整 mount 参数# /etc/fstab 中添加 noatime 减少元数据写入# UUID=xxx /data ext4 defaults,noatime,nodiratime 0 0# 5. 用 tmpfs / dev/shm 临时中转# 把临时文件放在内存文件系统,减少磁盘 I/Omount -t tmpfs -o size=10G tmpfs /mnt/tmptar czf - /local/dir/ > /mnt/tmp/file.tar.gznc <server_ip> 9999 < /mnt/tmp/file.tar.gz注意:tmpfs 占用内存,文件大小不能超过物理内存。
如果用 scp / rsync over SSH,SSH 配置影响性能:
# /etc/ssh/sshd_config# 关闭 DNS 反查(减少连接延迟)UseDNS no# 启用压缩Compression yes# 增加连接复用MaxSessions 100MaxStartups 100:30:200# 增加认证超时LoginGraceTime 30# 优化加密算法Ciphers aes128-ctr,aes192-ctr,aes256-ctrMACs hmac-sha2-256,hmac-sha2-512# 重启 sshdsystemctl restart sshd风险提醒:修改 sshd_config 前先确认配置正确,否则可能锁死 SSH 访问。建议保留一个额外的 SSH 会话作为应急。
大文件传输后必须做完整性校验:
# 源端生成校验和md5sum file.tar.gz > file.tar.gz.md5sha256sum file.tar.gz > file.tar.gz.sha256# 传输校验和文件(小文件,scp 即可)scp file.tar.gz.md5 user@remote:/remote/# 目标端校验md5sum -c file.tar.gz.md5sha256sum -c file.tar.gz.sha256# 校验通过输出:# file.tar.gz: OK生产环境强烈推荐用 sha256,md5 已经不抗碰撞攻击了。
#!/bin/bash# transfer_with_progress.sh# 用法:./transfer_with_progress.sh <src> <dst_user> <dst_host> <dst_path>set -eSRC=$1DST_USER=$2DST_HOST=$3DST_PATH=$4if [ -z "$SRC" ] || [ -z "$DST_USER" ] || [ -z "$DST_HOST" ] || [ -z "$DST_PATH" ]; thenecho"Usage: $0 <src> <dst_user> <dst_host> <dst_path>"exit 1fi# 获取源端文件大小SRC_SIZE=$(du -sb "$SRC" | awk '{print $1}')echo"Source: $SRC"echo"Source size: $SRC_SIZE bytes"echo"Destination: $DST_USER@$DST_HOST:$DST_PATH"echo"Starting transfer..."# 用 rsync 传输,开启进度rsync -avzP --bwlimit=0 -e "ssh -o StrictHostKeyChecking=no" \"$SRC""$DST_USER@$DST_HOST:$DST_PATH"echo"Transfer complete!"echo"Verifying integrity..."# 计算 MD5SRC_MD5=$(md5sum "$SRC" | awk '{print $1}')# 在目标端计算 MD5DST_MD5=$(ssh "$DST_USER@$DST_HOST""md5sum $DST_PATH/$(basename $SRC) | awk '{print \$1}'")if [ "$SRC_MD5" = "$DST_MD5" ]; thenecho"MD5 match: $SRC_MD5"echo"Transfer verified!"elseecho"MD5 mismatch!"echo"Source MD5: $SRC_MD5"echo"Destination MD5: $DST_MD5"exit 1fi#!/bin/bash# nc_transfer.sh# 用法:./nc_transfer.sh send|receive <port> <path>set -eACTION=$1PORT=$2PATH_ARG=$3if [ -z "$ACTION" ] || [ -z "$PORT" ] || [ -z "$PATH_ARG" ]; thenecho"Usage:"echo" Send: $0 send <port> <local_path>"echo" Receive: $0 receive <port> <remote_path>"exit 1fiif [ "$ACTION" = "send" ]; then# 发送端echo"Sending $PATH_ARG to remote:$PORT..." tar czf - "$PATH_ARG" | pv -s $(du -sb "$PATH_ARG" | awk '{print $1}') | nc -l -p $PORTelif [ "$ACTION" = "receive" ]; then# 接收端echo"Receiving on port $PORT to $PATH_ARG..." nc <REMOTE_IP> $PORT | pv | tar xzf - -C "$PATH_ARG"elseecho"Unknown action: $ACTION"exit 1fi#!/bin/bash# rsync_retry.sh# 用法:./rsync_retry.sh <src> <dst> <max_retries>set -eSRC=$1DST=$2MAX_RETRIES=${3:-5}RETRY_DELAY=${4:-10}if [ -z "$SRC" ] || [ -z "$DST" ]; thenecho"Usage: $0 <src> <dst> [max_retries] [retry_delay_seconds]"exit 1fiATTEMPT=1while [ $ATTEMPT -le $MAX_RETRIES ]; doecho"[Attempt $ATTEMPT/$MAX_RETRIES] rsync $SRC -> $DST"if rsync -avzP "$SRC""$DST"; thenecho"Transfer succeeded!"exit 0elseecho"Transfer failed. Retrying in $RETRY_DELAY seconds..." sleep $RETRY_DELAY ATTEMPT=$((ATTEMPT + 1))fidoneecho"Failed after $MAX_RETRIES attempts."exit 1#!/bin/bash# parallel_split_transfer.sh# 用法:./parallel_split_transfer.sh <src_dir> <dst_host> <dst_path> <chunk_size_mb>set -eSRC=$1DST_HOST=$2DST_PATH=$3CHUNK_SIZE=${4:-1024}# 默认 1GB# 临时目录TMP_DIR=$(mktemp -d)trap"rm -rf $TMP_DIR" EXIT# 打包并分卷echo"Packing and splitting $SRC into ${CHUNK_SIZE}MB chunks..."tar czf - "$SRC" | split -b ${CHUNK_SIZE}M - "$TMP_DIR/chunk_"# 生成分卷清单CHUNKS=($(ls $TMP_DIR/chunk_*))TOTAL=${#CHUNKS[@]}echo"Created $TOTAL chunks."# 并行传输echo"Transferring chunks in parallel..."printf'%s\n'"${CHUNKS[@]}" | xargs -n 1 -P 4 -I {} \ rsync -azP {} "$DST_HOST:$DST_PATH/"# 传输分卷清单REMOTE_CHUNKS=()for chunk in"${CHUNKS[@]}"; do REMOTE_CHUNKS+=("$DST_PATH/$(basename $chunk)")done# 在目标端合并echo"Merging chunks on remote..."ssh "$DST_HOST""cat ${REMOTE_CHUNKS[@]} | tar xzf - -C $DST_PATH/"# 清理远程分卷echo"Cleaning up remote chunks..."ssh "$DST_HOST""rm -f ${REMOTE_CHUNKS[@]}"echo"Transfer complete!"# 用 iftopyum install iftop -yapt install iftop -yiftop -i eth0# 用 nethogs(按进程)yum install nethogs -yapt install nethogs -ynethogs eth0# 用 sar 记录历史sar -n DEV 1# 用 iotopyum install iotop -yapt install iotop -yiotop# 用 iostatiostat -xm 1# 监控所有 scp / rsync / nc 进程watch -n 1 "ps -ef | grep -E '(scp|rsync|nc)' | grep -v grep"df -h 看目标端剩余空间。按以下顺序选型:
是否需要加密?
是否需要增量传输?
是否需要断点续传?
文件大小?
网络环境?
传输频率?
是否需要多线程?
是否需要 HTTP 服务?
Linux 下大文件传输的方案选择,本质是"加密、增量、断点续传、性能、安全"几个维度的权衡。
没有银弹,只有最合适的方案。生产环境推荐用 rsync + 自动重试脚本 + 完整性校验,覆盖 80% 的传输场景。极端场景(超大文件、低带宽、高丢包)才需要 nc + tar + split + aria2 等工具组合。
传输完成后务必做完整性校验,把校验记录和传输日志归档保存。重要传输任务应该有"开始时间 - 结束时间 - 文件清单 - 校验和 - 操作人"的完整记录。
复盘建议:定期梳理生产环境的传输任务,把零散的脚本整合成统一的传输平台,标准化"参数校验、进度显示、自动重试、完整性校验、日志记录"等流程。新增传输任务直接复用平台能力,避免每个工程师自己写一份脚本。
scp -P 2222 file user@host:/path/ # 指定端口scp -r dir/ user@host:/path/ # 递归复制目录scp -C file user@host:/path/ # 启用压缩scp -c aes128-ctr file user@host:/path/ # 指定加密算法scp -l 8000 file user@host:/path/ # 限速 8000 Kbit/sscp -p file user@host:/path/ # 保留权限和时间戳scp -q file user@host:/path/ # 安静模式(不显示进度)scp -v file user@host:/path/ # 详细模式(调试用)scp -4 file user@host:/path/ # 强制 IPv4scp -6 file user@host:/path/ # 强制 IPv6rsync -avzP src/ dst/ # 归档 + 详细 + 压缩 + 进度 + 断点续传rsync -avz --delete src/ dst/ # 同步时删除目标端多余文件(慎用)rsync -avz --exclude='*.log' src/ dst/ # 排除特定文件rsync -avz --include='*.txt' --exclude='*' ... # 包含特定文件rsync -avz --bwlimit=10240 src/ dst/ # 限速 10MB/srsync -avz -e "ssh -p 2222" src/ user@host: # 自定义 SSH 端口rsync -avz --dry-run src/ dst/ # 试运行(不实际执行)rsync -avz --whole-file src/ dst/ # 禁用增量算法rsync -avz --checksum src/ dst/ # 基于校验和判断差异rsync -avz --partial --inplace src/ dst/ # 原地更新(不创建临时文件)nc -l 9999 # 监听 9999 端口nc -l -p 9999 # 监听 9999 端口(兼容老版本)nc -l -k 9999 # 持续监听(接受多个连接)nc -w 10 host 9999 # 设置超时时间nc -v host 9999 # 详细模式nc -z -v host 1-1024 # 端口扫描nc -u -l 9999 # UDP 模式nc -l 9999 > file.out # 接收数据到文件nc host 9999 < file.in # 发送文件到服务端aria2c -x 16 http://url/file # 16 线程下载aria2c -c -x 16 http://url/file # 断点续传aria2c -d /data/ http://url/file # 指定下载目录aria2c --max-download-limit=10M http://url # 限速 10MB/saria2c -s 16 http://url/file # 分段数aria2c --input-file=urls.txt # 批量下载(urls.txt 包含 URL 列表)aria2c http://url1 http://url2 # 下载多个文件aria2c --seed-time=60 file.torrent # BT 做种 60 分钟curl -O http://url/file # 下载文件(保留远程文件名)curl -o localfile http://url/file # 下载到指定文件curl -C - -O http://url/file # 断点续传curl -u user:pass -O http://url/file # 带认证curl --limit-rate 10M -O http://url/file # 限速 10MB/scurl -T localfile -u user:pass ftp://url/ # 上传 FTPcurl --ftp-pasv ftp://url/file # FTP 被动模式curl -L http://url # 跟随重定向curl -H "Authorization: token" http://url # 自定义 Headercurl -X POST -d "key=value" http://url # POST 请求curl -s -o /dev/null -w "%{http_code}" url # 静默模式 + 输出 HTTP 状态码# 原因:SSH 公钥没配对# 解决:ssh-copy-id user@host# 或者手动追加公钥到目标端的 ~/.ssh/authorized_keys# 原因:网络不通或端口被防火墙拦截# 解决:# 1. ping 目标 IP 确认网络# 2. telnet 目标端口 22# 3. 检查防火墙规则(iptables -L / nft list ruleset)# 4. 检查云服务商安全组规则# 原因:目标磁盘空间不足# 解决:# 1. df -h 看目标端空间# 2. 清理磁盘# 3. 选择其他磁盘# 原因:目标端 rsync 没装、SSH 配置问题或网络中断# 解决:# 1. 目标端安装 rsync# 2. 检查 SSH 配置# 3. 用 -e "ssh -v" 看详细 SSH 错误# 原因:传输过程中文件损坏# 解决:# 1. 重新传输# 2. 检查网络丢包、磁盘 I/O 错误# 3. 用更稳定的传输工具(rsync with -P / aria2 -c)本文从工程实践角度,覆盖了 Linux 下大文件传输的 5 种方案:scp、rsync、nc + tar、tar + split、curl / wget / aria2。每种方案都有适用场景、优缺点、配置示例。
实际选型时遵循"加密需求 → 增量需求 → 断点续传需求 → 文件大小 → 网络环境 → 传输频率 → 多线程需求"的决策流程。生产环境推荐用 rsync + 自动重试脚本 + 完整性校验作为基础方案,覆盖 80% 的传输场景。特殊场景(内网、跨地域、超大文件)再选择 nc + tar、tar + split、aria2 等。
关键点: