Linux 两台服务器之间传输文件和文件夹的方法

'# Linux 两台服务器之间传输文件和文件夹的方法

一、背景与问题

在分布式系统中,跨服务器的文件传输是日常运维中高频操作。传统方式如手动复制、ftp、sftp、scp等工具各有优劣,但如何选择合适方案、规避安全风险、优化传输效率是关键。

核心挑战在于:

  1. 网络不稳定时的数据完整性保障
  2. 大文件传输时的性能优化
  3. 跨平台权限控制
  4. 安全传输的保障机制
  5. 传输过程中的断点续传能力

二、基本原理

1. SSH协议传输机制

基于SSH的文件传输(如scp、sftp)通过加密通道实现安全传输,其核心原理是:

  • 使用非对称加密建立安全连接
  • 基于SSH协议的文件传输通道
  • 通过压缩算法优化传输效率

2. rsync增量同步原理

rsync采用差分算法实现高效传输:

  • 基于校验和(如CRC32)比对文件差异
  • 仅传输差异数据块
  • 支持断点续传和压缩传输

3. SFTP协议特性

SFTP(SSH File Transfer Protocol)是基于SSH的文件传输协议,其特点包括:

  • 支持文件操作(创建/删除/重命名)
  • 支持目录遍历
  • 通过SSH加密通道传输

三、环境准备

1. 系统要求

  • CentOS 7.9 或 Ubuntu 22.04
  • 已安装SSH服务(sshd)
  • 双机互联网络(建议内网环境)

2. 配置SSH密钥认证

# 生成SSH密钥对
ssh-keygen -t ed25519

# 本地服务器配置
ssh-copy-id user@remote_host

3. 防火墙配置

# 开放SSH端口
sudo ufw allow 22

四、核心实现

1. scp命令传输(基础方案)

# 单文件传输
scp /path/to/file user@remote:/path/to/destination

# 多文件传输
scp file1 file2 user@remote:/path/to/destination

# 递归传输文件夹
scp -r /path/to/folder user@remote:/path/to/destination

关键原理:通过SSH加密通道传输文件,支持断点续传。适用于小文件传输,但对大文件效率较低。

2. rsync增量同步(推荐方案)

# 基础同步
rsync -avz /local/path user@remote:/remote/path

# 增量同步(只传输差异)
rsync -avz --delete /local/path user@remote:/remote/path

# 压缩传输
rsync -avz --compress --exclude='*.log' /local/path user@remote:/remote/path

关键原理:

  • --checksum:基于CRC32校验差异
  • --compress:压缩传输减少网络带宽
  • --delete:删除远程多余文件
  • --exclude:排除不需要传输的文件

3. sftp交互式传输(高级方案)

# 交互式传输
sftp user@remote_host
sftp> put local_file
sftp> get remote_file
sftp> mkdir remote_dir
sftp> quit

关键原理:通过SSH隧道建立交互式文件传输通道,支持文件操作和目录管理。

五、完整案例

案例:开发环境到生产环境的代码部署

# 本地服务器(开发环境)
rsync -avz --exclude='*.log' --exclude='node_modules' \
      /var/www/myapp/ user@prod:/var/www/myapp/

# 生产服务器(远程服务器)
rsync -avz --delete /var/www/myapp/ user@dev:/var/www/myapp/

场景说明:

  • 使用rsync进行双向同步
  • 排除日志文件和依赖包
  • 保持开发/生产环境同步
  • 使用SSH密钥免密码登录

六、源码解析(rsync核心机制)

1. 差分算法实现

// rsync核心算法伪代码
function compute_diff(src, dest) {
    checksum = calculate_checksum(src)
    if (checksum == calculate_checksum(dest)) {
        return empty
    }
    // 使用CRC32计算差异数据块
    return diff_data
}

2. 压缩传输优化

// 压缩算法伪代码
function compress_data(data) {
    if (data_size > threshold) {
        return compress_with_deflate(data)
    }
    return data
}

七、进阶使用

1. 增量备份方案

# 每天凌晨进行增量备份
rsync -avz --delete --link-dest=/backup/last/ /var/www/ user@backup:/backup/$(date +%Y%m%d)

2. 跨平台传输

# Windows到Linux传输(使用WinSCP)
winscp.exe /command "open sftp://user@remote:22" "put C:/local/path" "exit"

3. 安全增强配置

# 配置SSH限制
# /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no

八、性能与工程实践

1. 性能优化策略

优化策略说明效果
压缩传输使用--compress选项减少30%~50%带宽占用
并行传输使用-P指定多个端口提高多线程传输效率
带宽限制使用--bwlimit限制避免网络拥塞
增量传输使用--checksum减少重复传输量

2. 异常处理机制

# 带错误处理的rsync脚本
rsync -avz --delete /local/ user@remote:/remote/ || {
    echo "传输失败,进行回滚"
    rsync -avz --delete /remote/ user@remote:/local/
    exit 1
}

3. 安全风险控制

  • 使用SSH密钥认证替代密码
  • 配置防火墙限制访问IP
  • 定期更新SSH服务版本
  • 使用--exclude排除敏感文件

九、常见问题与踩坑

1. 权限问题

错误示例:

scp: /home/user/file: Permission denied

解决办法:

sudo chown user:user /home/user/file
sudo chmod 644 /home/user/file

2. 路径错误

错误示例:

rsync: failed to connect to remote host: No such host is known.

解决办法:

ping remote_host
nslookup remote_host

3. 网络中断

错误示例:

rsync: connection closed by remote host

解决办法:

rsync --partial --progress /local/ user@remote:/remote/

十、最佳实践

1. 推荐场景

  • 跨服务器代码部署
  • 数据备份与恢复
  • 日志文件同步
  • 配置文件同步

2. 应避免的场景

  • 需要实时传输的场景(建议使用rsync+inotify)
  • 超大文件传输(建议使用rsync+压缩)
  • 高安全要求场景(建议使用SFTP+SSL)

3. 实践建议

  • 重要数据使用rsync+压缩传输
  • 敏感文件使用SSH密钥认证
  • 大文件传输使用rsync+增量机制
  • 部署监控机制(如inotify)实现自动同步

十一、总结

Linux服务器间文件传输是运维工作的基础,选择合适的工具和方案至关重要。本文深入分析了scp、rsync、sftp等工具的原理,通过真实案例展示了不同场景下的应用方式。在实际开发中,应根据传输规模、安全要求、网络环境等因素选择合适方案,同时注意权限控制、异常处理和性能优化。通过合理配置和实践,可以有效提升跨服务器操作的效率和安全性。

最后修改于:2026年10月02日 00:50

评论已关闭

推荐阅读

AIGC实战——Transformer模型
2024年12月01日
Socket TCP 和 UDP 编程基础(Python)
2024年11月30日
python , tcp , udp
如何使用 ChatGPT 进行学术润色?你需要这些指令
2024年12月01日
AI
最新 Python 调用 OpenAi 详细教程实现问答、图像合成、图像理解、语音合成、语音识别(详细教程)
2024年11月24日
ChatGPT 和 DALL·E 2 配合生成故事绘本
2024年12月01日
omegaconf,一个超强的 Python 库!
2024年11月24日
【视觉AIGC识别】误差特征、人脸伪造检测、其他类型假图检测
2024年12月01日
[超级详细]如何在深度学习训练模型过程中使用 GPU 加速
2024年11月29日
Python 物理引擎pymunk最完整教程
2024年11月27日
MediaPipe 人体姿态与手指关键点检测教程
2024年11月27日
深入了解 Taipy:Python 打造 Web 应用的全面教程
2024年11月26日
基于Transformer的时间序列预测模型
2024年11月25日
Python在金融大数据分析中的AI应用(股价分析、量化交易)实战
2024年11月25日
AIGC Gradio系列学习教程之Components
2024年12月01日
Python3 `asyncio` — 异步 I/O,事件循环和并发工具
2024年11月30日
llama-factory SFT系列教程:大模型在自定义数据集 LoRA 训练与部署
2024年12月01日
Python 多线程和多进程用法
2024年11月24日
Python socket详解,全网最全教程
2024年11月27日
python之plot()和subplot()画图
2024年11月26日
理解 DALL·E 2、Stable Diffusion 和 Midjourney 工作原理
2024年12月01日