Skip to content

使用unison实现文件夹同步

✨文章摘要(AI生成)

Unison 是一款跨平台双向文件同步工具,通过 SSH 加密传输实现本地与远程主机间的安全同步。文章详解其安装配置、实时监控脚本编写及常见使用场景,重点阐述如何通过配置文件定制同步策略、结合 inotify-tools 实现文件变动实时同步,并给出版本一致性维护与 screen 会话管理等实用技巧,为开发环境同步、日志备份等场景提供高效解决方案。

一、Unison简介

Unison是一款跨平台的文件同步工具,支持Windows、Linux、macOS等系统,能够实现本地或远程文件夹的双向同步。其核心特点包括:

  • 双向同步:自动处理无冲突的更新,冲突部分提示用户选择策略;
  • SSH安全传输:通过SSH协议加密传输数据,支持压缩传输优化带宽;
  • 灵活配置:支持忽略特定文件/目录、保留文件属性(权限、属主等)。

二、环境准备

1. 安装Unison

在Linux系统(以CentOS 7为例)中安装:

bash
# 添加EPEL源并安装
yum -y install epel-release
yum makecache
yum -y install unison

ubuntu 系统中使用 apt 进行安装即可

bash
sudo apt install unison -y

2. 配置SSH免密登录

bash
# 生成密钥对(默认路径:~/.ssh/)
ssh-keygen -t rsa

# 将公钥复制到远程主机(需替换目标IP)
ssh-copy-id root@目标主机IP

三、基本使用

1. 本地同步

bash
# 同步本地两个目录(-batch启用全自动模式)
unison -batch /root/Files /root/Backup

2. 远程同步

bash
# 格式:unison <本地目录> ssh://用户@远程主机IP//远程目录
unison -batch /root/Files ssh://root@192.168.43.166//root/Files

3. 测试连通性

bash
unison -testServer /本地目录 ssh://用户@远程主机//远程目录

四、高级配置

1. 配置文件(default.prf)

~/.unison/下创建配置文件:

lua
root = /root/test
root = ssh://root@192.168.3.34//root/test
batch = true          # 自动模式
ignore = Path node_modules  # 忽略node_modules目录
owner = true          # 保留文件属主
group = true          # 保留文件组
perms = -1            # 保留权限
sshargs = -C          # SSH压缩传输

2. 常用参数

参数功能说明
-ignore "Name .git"忽略.git目录
-repeat 60每60秒自动同步一次
-logfile /path/to/log记录同步日志
-force强制覆盖目标文件

五、实时同步方案

结合inotify-tools实现文件变动监控:

bash
#!/bin/bash
LOCAL_DIR="/root/test"
REMOTE_HOST="root@192.168.3.34"
REMOTE_DIR="/root/test"

# 监控文件变动事件(修改、创建、删除等)
inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' \
  -e modify,create,delete,attrib $LOCAL_DIR | while read file; do
    unison -batch $LOCAL_DIR ssh://$REMOTE_HOST//$REMOTE_DIR
done

运行方式:使用nohupscreen保持后台运行。

六、注意事项

  1. 版本一致性:本地与远程主机需安装相同Unison版本;
  2. 防火墙配置:确保SSH端口(默认22)开放;
  3. 路径规范:远程目录需使用绝对路径(如//root/test);
  4. 冲突处理:首次同步建议添加-force参数强制统一基线。

七、总结

Unison凭借其双向同步、SSH安全传输和灵活配置特性,成为跨平台文件同步的理想工具。通过结合inotify监控脚本,可轻松实现实时同步,适用于日志备份、开发环境同步等场景。

扩展阅读

扩展

screen会话保持

使用screen建立一个独立的会话保持。

bash
screen-S rsync   #-S建立新的screen会话
unison default.prf  #执行unison会话。

使用快捷键ctrl+a d(即按住ctrl,依次再按a,d)来保存这个会话窗口

bash
screen -ls  #查看screen会话
screen-r rsync #-r选项可以恢复会话

快捷键ctrl+a d(即按住ctrl,依次再按a,d)来保存这个会话窗口,当然程序还在自动进行不会关闭。

需要恢复会话的时候就需要执行

bash
screen-r lnmp   # lnmp就是刚开始设置的会话名称

如果在恢复会话的时候忘记了或者没有设定会话名称我们就要执行:

bash
screen-ls

他会列出你所有的会话列表,然后使用:

bash
screen-r    # 会话名称来恢复会话窗口。

关闭screen的会话

bash
exit

会提示:[screen is terminating],表示已经成功退出screen会话。

screen命令常用的一些快捷键:

ctrl+ac :在当前screen会话中创建窗口 ctrl+a w :窗口列表 ctrl+a n :下一个窗口 ctrl+a p :上一个窗口 ctrl+a 0-9 :在第0个窗口和第9个窗口之间切换