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

文章目录

  • [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 函数,它们最适合经常使用和路径灵活的需求。

相关推荐
carl.xu6 小时前
ubuntu 配置OpenOCD与RT-RT-thread环境的记录
linux·运维·ubuntu
重生之我是小白菜8 小时前
在 Linux 下Ubuntu创建同权限用户
linux·运维·ubuntu
sleP4o11 小时前
【Ubuntu 24.04】常见问题解决
linux·ubuntu
过过过呀Glik13 小时前
在 Ubuntu 中安装 C++ 版本的 Protocol Buffers
linux·c++·ubuntu·protocol
Goafan14 小时前
Ubuntu24.04安装AppImage报错AppImages require FUSE to run.
ubuntu
bai_shuang14 小时前
Linux环境(Ubuntu)上搭建MQTT服务器(EMQX )网络环境部署
linux·服务器·ubuntu
longze_71 天前
国产信创实践(国能磐石服务器操作系统CEOS +东方通TongHttpServer)
linux·服务器·nginx·ubuntu·centos·操作系统·openeuler
梦游钓鱼1 天前
Ubuntu中批量重命名,rename
linux·运维·ubuntu
浪浪山小白兔1 天前
使用Supervisor在Ubuntu中实现后台自启动服务
运维·服务器·ubuntu