长途和本地文件的相互同步

打印 上一主题 下一主题

主题 1036|帖子 1036|积分 3108

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

1. 基础概念



  • Push:将本地的文件同步到长途。
  • Pull:将长途的文件同步到本地。
rsync 的根本语法:
  1. rsync [选项] 源路径 目标路径
复制代码

2. 示例操作

Push 操作:本地 → 长途
  1. rsync -avz --delete /local/path/ user@remote_host:/remote/path/
复制代码


  • /local/path/ 是本地目录(留意末尾的 /)。
  • user@remote_host:/remote/path/ 是长途主机的目的路径。
  • 关键选项:

    • -a:归档模式,保存文件权限、时间戳等。
    • -v:显示详细信息。
    • -z:启用压缩,进步传输服从。
    • --delete:删除目的路径中不在源路径中的文件,保持完全同步。

Pull 操作:长途 → 本地
  1. rsync -avz --delete user@remote_host:/remote/path/ /local/path/
复制代码


  • 语法类似于 push,只是把源路径和目的路径交换。

3. 定制化和进阶用法

排除某些文件或目录
使用 --exclude 选项:
  1. rsync -avz --delete --exclude "node_modules/" --exclude "*.log" /local/path/ user@remote_host:/remote/path/
复制代码
使用 SSH 密钥认证
为了避免频仍输入密码,可以设置 SSH 密钥认证:

  • 生成 SSH 密钥:
    1. ssh-keygen -t rsa
    复制代码
  • 将公钥复制到长途主机:
    1. ssh-copy-id user@remote_host
    复制代码
测试同步操作
使用 --dry-run 选项模仿操作,检查同步内容:
  1. rsync -avz --dry-run /local/path/ user@remote_host:/remote/path/
复制代码

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

可以使用 cron 或 Windows 任务筹划程序实现定时同步。比方:
Linux 上的 cron 示例
编辑 cron:
  1. crontab -e
复制代码
添加如下内容,每 30 分钟同步一次:
  1. */30 * * * * rsync -avz --delete /local/path/ user@remote_host:/remote/path/
复制代码
Windows 系统(任务筹划程序)
将 rsync 下令写入 .bat 文件,并通过任务筹划程序定时运行。

留意事项


  • 没有版本控制:rsync 不支持历史记载,如果需要像 Git 那样的版本管理,可以结合 Git 使用。
  • 同步时留意删除操作:使用 --delete 时,要确保备份数据,以免误删文件。
  • 网络题目:rsync 的增量同步和制止恢复机制在网络不稳固时非常有效。
这套流程可以很好地模仿 push 和 pull 的功能,但如果需要更复杂的版本管理功能,建议直接使用 Git。
2 下令简化

如果路径是动态变革的,可以计划一个更灵活的办理方案,让你在运行时通报路径参数。以下是几种方法实现这一需求:

1. 动态传参的脚本

编写一个脚本,支持在运行时指定路径:
脚本内容
创建一个名为 sync.sh 的脚本,内容如下:
  1. #!/bin/bash
  2. # 检查参数
  3. if [ "$#" -lt 3 ]; then
  4.     echo "Usage: $0 [push|pull] [local_path] [remote_path]"
  5.     exit 1
  6. fi
  7. ACTION=$1
  8. LOCAL_PATH=$2
  9. REMOTE_PATH=$3
  10. REMOTE_USER="user"  # 替换为你的远程用户名
  11. REMOTE_HOST="remote_host"  # 替换为你的远程主机
  12. if [ "$ACTION" == "push" ]; then
  13.     rsync -avz --delete "$LOCAL_PATH" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH"
  14. elif [ "$ACTION" == "pull" ]; then
  15.     rsync -avz --delete "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH" "$LOCAL_PATH"
  16. else
  17.     echo "Invalid action: $ACTION. Use 'push' or 'pull'."
  18.     exit 1
  19. fi
复制代码
赋予执行权限
  1. chmod +x sync.sh
复制代码
使用方法
运行时通报路径:
  1. ./sync.sh push /local/path /remote/path
  2. ./sync.sh pull /local/path /remote/path
复制代码

2. Shell 函数支持动态路径

在 Shell 配置文件(如 ~/.bashrc 或 ~/.zshrc)中定义一个动态路径的函数:
函数定义
  1. function sync() {
  2.     if [ "$#" -lt 3 ]; then
  3.         echo "Usage: sync [push|pull] [local_path] [remote_path]"
  4.         return 1
  5.     fi
  6.     local action=$1
  7.     local local_path=$2
  8.     local remote_path=$3
  9.     local remote_user="user"  # 替换为你的远程用户名
  10.     local remote_host="remote_host"  # 替换为你的远程主机
  11.     if [ "$action" == "push" ]; then
  12.         rsync -avz --delete "$local_path" "$remote_user@$remote_host:$remote_path"
  13.     elif [ "$action" == "pull" ]; then
  14.         rsync -avz --delete "$remote_user@$remote_host:$remote_path" "$local_path"
  15.     else
  16.         echo "Invalid action: $action. Use 'push' or 'pull'."
  17.         return 1
  18.     fi
  19. }
复制代码
激活函数
  1. source ~/.bashrc  # 或 ~/.zshrc
复制代码
使用方法
  1. sync push /local/path /remote/path
  2. sync pull /local/path /remote/path
复制代码

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

在脚本中结合环境变量,减少重复输入常用的用户名和主机名:
脚本内容
  1. #!/bin/bash
  2. REMOTE_USER=${REMOTE_USER:-"user"}        # 默认远程用户名
  3. REMOTE_HOST=${REMOTE_HOST:-"remote_host"}  # 默认远程主机
  4. if [ "$#" -lt 3 ]; then
  5.     echo "Usage: $0 [push|pull] [local_path] [remote_path]"
  6.     exit 1
  7. fi
  8. ACTION=$1
  9. LOCAL_PATH=$2
  10. REMOTE_PATH=$3
  11. if [ "$ACTION" == "push" ]; then
  12.     rsync -avz --delete "$LOCAL_PATH" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH"
  13. elif [ "$ACTION" == "pull" ]; then
  14.     rsync -avz --delete "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH" "$LOCAL_PATH"
  15. else
  16.     echo "Invalid action: $ACTION. Use 'push' or 'pull'."
  17.     exit 1
  18. fi
复制代码
运行脚本时指定环境变量
  1. REMOTE_USER=myuser REMOTE_HOST=myhost ./sync.sh push /local/path /remote/path
复制代码

4. Makefile 支持动态路径

用 Makefile 通报路径参数:
Makefile 示例
  1. push:
  2.         rsync -avz --delete $(LOCAL_PATH) user@remote_host:$(REMOTE_PATH)
  3. pull:
  4.         rsync -avz --delete user@remote_host:$(REMOTE_PATH) $(LOCAL_PATH)
复制代码
使用方法
运行时指定变量:
  1. make push LOCAL_PATH=/local/path REMOTE_PATH=/remote/path
  2. make pull LOCAL_PATH=/local/path REMOTE_PATH=/remote/path
复制代码

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

三尺非寒

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表