在远程服务器和本地同步数据的指南

news2026/2/13 22:19:23

在远程服务器和本地同步数据的指南

在现代软件开发和数据管理中,保持本地和远程服务器之间的数据同步是至关重要的。无论是代码、配置文件还是其他数据,确保它们在不同环境中的一致性都是高效工作的关键。本文将介绍如何使用 Bash 脚本和 rsync 工具在本地和远程服务器之间同步数据,重点讲解两种同步方式:直接同步和通过跳板机同步。

背景

在许多开发和运维场景中,数据的同步是常见需求。不同的同步方式适用于不同的环境和安全要求。选择合适的同步方式可以提高效率并确保数据安全。

  • 直接同步:适用于可以直接访问目标服务器的情况,通常在同一局域网内或目标服务器的网络配置允许直接连接时使用。
  • 通过跳板机同步:适用于需要通过中间服务器(跳板机)访问目标服务器的情况。这种方式通常用于安全性较高的环境,能够限制对内部网络的直接访问。
    我们定义了两个同步目录:
LOCAL_DIR_DEEPNS="/path/to/local/deepns/"
REMOTE_DIR_DEEPNS="user@192.168.1.10:~/path/to/remote/deepns/"

LOCAL_DIR_MRAUTOINSPECT="/path/to/local/MR-autoinspect/"
REMOTE_DIR_MRAUTOINSPECT="user@192.168.1.20:/path/to/remote/MR-autoinspect/"

在这个网络环境中,存在以下互通关系:

  • 本地机器与 192.168.1.10 互通:这意味着本地机器可以直接访问 192.168.1.10,并与其进行数据传输。
  • 192.168.1.10192.168.1.20 互通:这表示 192.168.1.10 可以访问 192.168.1.20,并与其进行数据交换。
  • 本地机器无法直接访问 192.168.1.20:这意味着本地机器不能直接与 192.168.1.20 进行通信,无法直接同步数据。
    因此,在同步操作中,我们使用直接同步的方式将本地的 deepns 目录与 192.168.1.10 进行同步,而对于 MR-autoinspect 目录的同步,则需要通过 192.168.1.10 作为跳板机来访问 192.168.1.20。这种设置确保了数据的安全性和网络的合理配置,同时也提供了灵活的同步方式。

使用 rsync 工具进行数据同步

rsync 是一个强大的文件传输和同步工具,能够高效地将文件和目录从一个位置复制到另一个位置。它支持增量备份,只传输变化的部分,从而节省带宽和时间。

完整脚本示意

以下是一个用于同步数据的 Bash 脚本示例。该脚本定义了多个目录,并提供了两种同步方式:直接同步和通过跳板机进行同步。

#!/bin/bash

# 定义源目录和目标目录
#!/bin/bash

# 定义源目录和目标目录
LOCAL_DIR_DEEPNS="/path/to/local/deepns/"
REMOTE_DIR_DEEPNS="user@192.168.1.10:~/path/to/remote/deepns/"

LOCAL_DIR_MRAUTOINSPECT="/path/to/local/MR-autoinspect/"
REMOTE_DIR_MRAUTOINSPECT="user@192.168.1.20:/path/to/remote/MR-autoinspect/"

# 定义rsync命令选项
RSYNC_OPTS="-avzhP --delete --stats"

# 忽略的文件夹
EXCLUDE_OPTS="--exclude='__pycache__' --exclude='.git' --exclude='.idea'"

# 日志文件
LOG_FILE="/Users/bytedance/priv_tools/sync_devices.log"

# 日志记录函数
function log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a $LOG_FILE
}

# 通用同步函数
function sync_directories() {
    local source_dir=$1
    local target_dir=$2
    local ssh_jump=$3
    local direction=$4

    log "Checking differences between $direction directories:"
    rsync $RSYNC_OPTS $EXCLUDE_OPTS -e "ssh $ssh_jump" --dry-run $source_dir $target_dir | tee -a $LOG_FILE

    # 提示用户具体的同步信息,换行显示
    read -p "Do you want to synchronize
from   --------   $source_dir 
to     --------   $target_dir? 
(y/n) " answer
    if [ "$answer" != "${answer#[Yy]}" ] ;then
        log "Starting synchronization from $source_dir to $target_dir..."
        rsync $RSYNC_OPTS $EXCLUDE_OPTS -e "ssh $ssh_jump" $source_dir $target_dir | tee -a $LOG_FILE
        log "Synchronization from $source_dir to $target_dir completed."
    else
        log "Synchronization from $source_dir to $target_dir aborted."
    fi
}

# 主程序逻辑
if [ "$1" == "local_to_remote_deepns" ] ;then
    sync_directories $LOCAL_DIR_DEEPNS $REMOTE_DIR_DEEPNS "" "$LOCAL_DIR_DEEPNS to $REMOTE_DIR_DEEPNS"
elif [ "$1" == "remote_to_local_deepns" ] ;then
    sync_directories $REMOTE_DIR_DEEPNS $LOCAL_DIR_DEEPNS "" "$REMOTE_DIR_DEEPNS to $LOCAL_DIR_DEEPNS"
elif [ "$1" == "local_to_remote_mr" ] ;then
    sync_directories $LOCAL_DIR_MRAUTOINSPECT $REMOTE_DIR_MRAUTOINSPECT "-J user@192.168.1.10" "$LOCAL_DIR_MRAUTOINSPECT to $REMOTE_DIR_MRAUTOINSPECT"
elif [ "$1" == "remote_to_local_mr" ] ;then
    sync_directories $REMOTE_DIR_MRAUTOINSPECT $LOCAL_DIR_MRAUTOINSPECT "-J user@192.168.1.10" "$REMOTE_DIR_MRAUTOINSPECT to $LOCAL_DIR_MRAUTOINSPECT"
else
    printf "Usage: $0 {\nlocal_to_remote_deepns\nremote_to_local_deepns\nlocal_to_remote_mr\nremote_to_local_mr\nlocal_to_remote_deepaec\nremote_to_local_deepaec\n}\n"
fi

脚本功能

  • 定义目录:脚本中定义了多个本地和远程目录,用于存储需要同步的文件。
  • rsync 选项:使用 -avzhP --delete --stats 选项,确保文件以归档模式传输,保持文件权限和时间戳,并显示传输进度和统计信息。
  • 日志记录:通过 log 函数记录同步过程中的重要信息和时间戳。
  • 同步函数:定义了同步函数,用于本地到远程和远程到本地的同步。
  • 用户确认:在执行实际同步之前,脚本会进行干运行(dry-run),并提示用户确认是否继续同步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2250534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

下载安装Android Studio

(一)Android Studio下载地址 https://developer.android.google.cn/studio 滑动到 点击下载文档 打开新网页 切换到english ![](https://i-blog.csdnimg.cn/direct/b7052b434f9d4418b9d56c66cdd59fae.png 等待一会,出现 点同意后&#xff0…

【解决方案】pycharm出现 为项目选择的Python解释器无效

文章目录 1.问题重述2.解决方案END 1.问题重述 第二次启动项目的时候出现 2.解决方案 右下角点 先选无解释器,然后在用项目配置好的解释器,然后就好了,估计是第二次启动的时候没有识别到,UI的信号设置的问题 END

浏览器的数据六种存储方法比较 :LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite

在构建该 Web 应用程序,并且希望将数据存储在用户浏览器中。也许您只需要存储一些小标志,或者甚至需要一个成熟的数据库。 我们构建的 Web 应用程序类型发生了显着变化。在网络发展的早期,我们提供静态 html 文件。然后我们提供动态渲染的 h…

linux一键部署apache脚本

分享一下自己制作的一键部署apache脚本: 脚本已和当前文章绑定,请移步下载(免费!免费!免费!) (单纯的分享!) 步骤: 将文件/内容上传到终端中 …

Java ConcurrentHashMap

Java Map本质不是线程安全的,HashTable和Collections同步包装器(Synchronized Wrapper)在并发场景下性能低。Java还为实现 Map 的线程安全提供了并发包,保证线程安全的方式从synchronize简单方式到精细化,比如Concurre…

redis下载、基础数据类型、操作讲解说明,持久化、springboot整合等

1 Redis是什么 官网:https://redis.io 开发者:Antirez Redis诞生于2009年全称是Remote Dictionary Server 远程词典服务器,是一个基于内存的键值型NoSQL数据库。 Redis是一个开源的、高性能的键值对存储系统,它支持多种数据结构&…

C# 解决【托管调试助手 “ContextSwitchDeadlock“:……】问题

文章目录 一、遇到问题二、解决办法 一、遇到问题 托管调试助手 “ContextSwitchDeadlock”:“CLR 无法从 COM 上下文 0x56e81e70 转换为 COM 上下文 0x56e81d48,这种状态已持续 60 秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows …

系统学习算法: 专题二 滑动窗口

题目一: 算法原理: 依然第一反应是暴力枚举,将所有的子数组都枚举出来,找到满足条件的长度最小的子数组,但是需要两层循环,时间复杂度来到O(N^2) 接下来就该思考如何进行优化 如果…

QGIS制作xyz切片(mbtiles)

MBTiles是由MapBox制定的一种将瓦片地图数据存储到SQLite数据库中并可快速使用,管理和分享的规范。它使得数以百万的瓦片数据存储在一个文件中,而且SQLite数据库支持多种平台,所以使用MBTiles在移动设备上浏览瓦片数据是比较理想的方式。 QGI…

软件测试——性能测试工具JMeter

1.JMeter介绍 Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件。JMeter小巧轻便且免费,逐渐成为了主流的性能测试工具,是每个测试人员都必须要掌握的工具之一。 环境要求: ​ 需要Java8或者更高的版本。 1.1 JMeter的下…

【C++算法】20.二分查找算法_x 的平方根

文章目录 题目链接:题目描述:解法C 算法代码:图解 题目链接: 69. x 的平方根 题目描述: 解法 暴力解法: 如果x17 从1,2,3,4,5......这些数里面找他们的平方…

拥抱 OpenTelemetry:阿里云 Java Agent 演进实践

作者:陈承 背景 在 2018 年的 2 月,ARMS Java Agent 的第一个版本正式发布,为用户提供无侵入的的可观测数据采集服务。6 年后的今天,随着软件技术的迅猛发展、业务场景的逐渐丰富、用户规模的快速增长,我们逐渐发现过…

【项目日记】仿mudou的高并发服务器 --- 实现HTTP服务器

对于生命,你不妨大胆一点, 因为我们始终要失去它。 --- 尼采 --- ✨✨✨项目地址在这里 ✨✨✨ ✨✨✨https://gitee.com/penggli_2_0/TcpServer✨✨✨ 仿mudou的高并发服务器 1 前言2 Util工具类3 HTTP协议3.1 HTTP请求3.2 HTTP应答 4 上下文解析模块…

从0在自己机器上部署AlphaFold 3

本文介绍如何在自己本地机器上安装AlphaFold 3。 在10月份,Google DeepMind的首席执行官Demis Hassabis和高级研究科学家John M. Jumper所领导的团队,利用AI技术成功预测了几乎所有已知蛋白质的结构,开发出备受赞誉的AlphaFold,并…

faiss库中ivf-sq(ScalarQuantizer,标量量化)代码解读-6

调试 经过gdb调试获取的调用栈内容如下&#xff0c;链接&#xff1a; 步骤函数名称文件位置说明1faiss::IndexFlatCodes::add/faiss/IndexFlatCodes.cpp:24在 add 方法中&#xff0c;检查是否已经训练完成&#xff0c;准备添加向量到索引中。2std::vector<unsigned char&g…

SQL进阶——子查询与视图

在SQL中&#xff0c;子查询和视图是两种强大的技术&#xff0c;用于处理复杂的查询、提高代码的重用性以及优化查询性能。子查询允许开发者在查询中嵌套其他查询&#xff0c;而视图则是对复杂查询的封装&#xff0c;可以简化开发工作并提高代码的可维护性。 本章将深入探讨如何…

【论文阅读】 Learning to Upsample by Learning to Sample

论文结构目录 一、之前的上采样器二、DySample概述三、不同上采样器比较四、整体架构五、设计过程&#xff08;1&#xff09;初步设计&#xff08;2&#xff09;第一次修改&#xff08;3&#xff09;第二次修改&#xff08;4&#xff09;第三次修改 六、DySample四种变体七、复…

Online Judge——【前端项目初始化】项目通用布局开发及初始化

目录 一、新建layouts二、更新App.vue文件三、选择一个布局&#xff08;Layout&#xff09;四、通用菜单Menu的实现菜单路由改为读取路由文件 五、绑定跳转事件六、同步路由到菜单项 一、新建layouts 这里新建一个专门存放布局的布局文件layouts&#xff1a; 然后在该文件夹&…

uniapp首页样式,实现菜单导航结构

实现菜单导航结构 1.导入字体图标库需要的文件 2.修改引用路径iconfont.css 3.导入到App.vue中 <style>import url(./static/font/iconfont.css); </style>导航区域代码 VUE代码 <template><view class"home"><!-- 导航区域 --><…

《代码随想录》刷题笔记——栈与队列篇【java实现】

文章目录 用栈实现队列用队列实现栈有效的括号我的解法代码随想录 删除字符串中的所有相邻重复项我的解法代码随想录栈解法字符串充当栈※双指针 逆波兰表达式求值我的解法代码随想录 滑动窗口最大值我的解法暴力解法暴力解法一点优化单调队列 代码随想录单调队列 前 K 个高频元…