远程和本地文件的互相同步

文章目录

  • [1、rsync实现类似git push pull功能](#1、rsync实现类似git push pull功能)
    • [1. 基础概念](#1. 基础概念)
    • [2. 示例操作](#2. 示例操作)
    • [3. 定制化和进阶用法](#3. 定制化和进阶用法)
    • [4. 定时同步(类似自动化)](#4. 定时同步(类似自动化))
  • [2 命令简化](#2 命令简化)
    • [1. 动态传参的脚本](#1. 动态传参的脚本)
    • [2. Shell 函数支持动态路径](#2. Shell 函数支持动态路径)
    • [3. 结合环境变量和参数(更简洁)](#3. 结合环境变量和参数(更简洁))
    • [4. Makefile 支持动态路径](#4. Makefile 支持动态路径)

使用场景,远程有一台无法连接互联网的服务器,性能强大;本地有一台性能差的电脑,但可以上网。那么要合并这两台电脑的功能,取其强,那么做为程序员,就是在本地编辑,再同步到远程,然后在远程执行。
rsync 是一个高效的文件同步工具,但它不像 Git 那样具有版本控制功能。你可以通过 rsync 在本地和远程主机之间同步文件,实现类似 Git 的 pushpull 操作。那么将使用rsync实现这个功能

1、rsync实现类似git push pull功能

以下是如何用 rsync 实现类似 Git 的 pushpull 操作:


1. 基础概念

  • Push:将本地的文件同步到远程。
  • Pull:将远程的文件同步到本地。

rsync 的基本语法:

bash 复制代码
rsync [选项] 源路径 目标路径

2. 示例操作

Push 操作:本地 → 远程

bash 复制代码
rsync -avz --delete /local/path/ user@remote_host:/remote/path/
  • /local/path/ 是本地目录(注意末尾的 /)。
  • user@remote_host:/remote/path/ 是远程主机的目标路径。
  • 关键选项:
    • -a:归档模式,保留文件权限、时间戳等。
    • -v:显示详细信息。
    • -z:启用压缩,提高传输效率。
    • --delete:删除目标路径中不在源路径中的文件,保持完全同步。

Pull 操作:远程 → 本地

bash 复制代码
rsync -avz --delete user@remote_host:/remote/path/ /local/path/
  • 语法类似于 push,只是把源路径和目标路径互换。

3. 定制化和进阶用法

排除某些文件或目录

使用 --exclude 选项:

bash 复制代码
rsync -avz --delete --exclude "node_modules/" --exclude "*.log" /local/path/ user@remote_host:/remote/path/

使用 SSH 密钥认证

为了避免频繁输入密码,可以设置 SSH 密钥认证:

  1. 生成 SSH 密钥:

    bash 复制代码
    ssh-keygen -t rsa
  2. 将公钥复制到远程主机:

    bash 复制代码
    ssh-copy-id user@remote_host

测试同步操作

使用 --dry-run 选项模拟操作,检查同步内容:

bash 复制代码
rsync -avz --dry-run /local/path/ user@remote_host:/remote/path/

4. 定时同步(类似自动化)

可以使用 cron 或 Windows 任务计划程序实现定时同步。例如:

Linux 上的 cron 示例

编辑 cron

bash 复制代码
crontab -e

添加如下内容,每 30 分钟同步一次:

bash 复制代码
*/30 * * * * rsync -avz --delete /local/path/ user@remote_host:/remote/path/

Windows 系统(任务计划程序)

rsync 命令写入 .bat 文件,并通过任务计划程序定时运行。


注意事项

  • 没有版本控制rsync 不支持历史记录,如果需要像 Git 那样的版本管理,可以结合 Git 使用。
  • 同步时注意删除操作 :使用 --delete 时,要确保备份数据,以免误删文件。
  • 网络问题rsync 的增量同步和中断恢复机制在网络不稳定时非常有用。

这套流程可以很好地模拟 pushpull 的功能,但如果需要更复杂的版本管理功能,建议直接使用 Git。

2 命令简化

如果路径是动态变化的,可以设计一个更灵活的解决方案,让你在运行时传递路径参数。以下是几种方法实现这一需求:


1. 动态传参的脚本

编写一个脚本,支持在运行时指定路径:

脚本内容

创建一个名为 sync.sh 的脚本,内容如下:

bash 复制代码
#!/bin/bash

# 检查参数
if [ "$#" -lt 3 ]; then
    echo "Usage: $0 [push|pull] [local_path] [remote_path]"
    exit 1
fi

ACTION=$1
LOCAL_PATH=$2
REMOTE_PATH=$3
REMOTE_USER="user"  # 替换为你的远程用户名
REMOTE_HOST="remote_host"  # 替换为你的远程主机

if [ "$ACTION" == "push" ]; then
    rsync -avz --delete "$LOCAL_PATH" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH"
elif [ "$ACTION" == "pull" ]; then
    rsync -avz --delete "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH" "$LOCAL_PATH"
else
    echo "Invalid action: $ACTION. Use 'push' or 'pull'."
    exit 1
fi

赋予执行权限

bash 复制代码
chmod +x sync.sh

使用方法

运行时传递路径:

bash 复制代码
./sync.sh push /local/path /remote/path
./sync.sh pull /local/path /remote/path

2. Shell 函数支持动态路径

在 Shell 配置文件(如 ~/.bashrc~/.zshrc)中定义一个动态路径的函数:

函数定义

bash 复制代码
function sync() {
    if [ "$#" -lt 3 ]; then
        echo "Usage: sync [push|pull] [local_path] [remote_path]"
        return 1
    fi

    local action=$1
    local local_path=$2
    local remote_path=$3
    local remote_user="user"  # 替换为你的远程用户名
    local remote_host="remote_host"  # 替换为你的远程主机

    if [ "$action" == "push" ]; then
        rsync -avz --delete "$local_path" "$remote_user@$remote_host:$remote_path"
    elif [ "$action" == "pull" ]; then
        rsync -avz --delete "$remote_user@$remote_host:$remote_path" "$local_path"
    else
        echo "Invalid action: $action. Use 'push' or 'pull'."
        return 1
    fi
}

激活函数

bash 复制代码
source ~/.bashrc  # 或 ~/.zshrc

使用方法

bash 复制代码
sync push /local/path /remote/path
sync pull /local/path /remote/path

3. 结合环境变量和参数(更简洁)

在脚本中结合环境变量,减少重复输入常用的用户名和主机名:

脚本内容

bash 复制代码
#!/bin/bash

REMOTE_USER=${REMOTE_USER:-"user"}        # 默认远程用户名
REMOTE_HOST=${REMOTE_HOST:-"remote_host"}  # 默认远程主机

if [ "$#" -lt 3 ]; then
    echo "Usage: $0 [push|pull] [local_path] [remote_path]"
    exit 1
fi

ACTION=$1
LOCAL_PATH=$2
REMOTE_PATH=$3

if [ "$ACTION" == "push" ]; then
    rsync -avz --delete "$LOCAL_PATH" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH"
elif [ "$ACTION" == "pull" ]; then
    rsync -avz --delete "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH" "$LOCAL_PATH"
else
    echo "Invalid action: $ACTION. Use 'push' or 'pull'."
    exit 1
fi

运行脚本时指定环境变量

bash 复制代码
REMOTE_USER=myuser REMOTE_HOST=myhost ./sync.sh push /local/path /remote/path

4. Makefile 支持动态路径

用 Makefile 传递路径参数:

Makefile 示例

makefile 复制代码
push:
	rsync -avz --delete $(LOCAL_PATH) user@remote_host:$(REMOTE_PATH)

pull:
	rsync -avz --delete user@remote_host:$(REMOTE_PATH) $(LOCAL_PATH)

使用方法

运行时指定变量:

bash 复制代码
make push LOCAL_PATH=/local/path REMOTE_PATH=/remote/path
make pull LOCAL_PATH=/local/path REMOTE_PATH=/remote/path

通过这些方式,你可以实现动态指定路径,同时保持命令简洁,推荐根据使用场景选择 脚本Shell 函数,它们最适合经常使用和路径灵活的需求。

相关推荐
好奇的菜鸟8 小时前
如何在 Ubuntu 24.04 (Noble) 上使用阿里源
linux·运维·ubuntu
好奇的菜鸟10 小时前
如何在Ubuntu上检查MySQL是否启动并放开3306端口
mysql·ubuntu·adb
ZPC821013 小时前
ubuntu 6.8.0 安装xenomai3.3
linux·运维·ubuntu
电脑能手14 小时前
遇到该问题:kex_exchange_identification: read: Connection reset`的解决办法
linux·ubuntu·ssh
snoopyfly~14 小时前
Ubuntu 24.04 安装配置 Redis 7.0 开机自启
linux·redis·ubuntu
精英的英14 小时前
在Ubuntu 24.04主机上创建Ubuntu 14.04编译环境的完整指南
linux·运维·ubuntu
奇妙之二进制15 小时前
计算机科学导论(10)什么是BIOS
ubuntu·计算机基础
岁月玲珑15 小时前
【如何判断Linux系统是Ubuntu还是CentOS】
linux·ubuntu·centos
Kevin不想说话9261916 小时前
Ubuntu 24.04 安装搜狗输入法完整教程
ubuntu
矩阵老炮20 小时前
Ubuntu20.4编译AOSP源码实践
ubuntu·aosp