Unison – 自动同步计算机

有没有办法使用Unison自动同步多台计算机(即主文件夹中的特定目录)? 如果没有,是否有替代方案可以做到这一点? 我并不是完全反对一直打开Unison并手动进行同步,但是当它打开时你必须选择一个只对应一个目录的配置文件,所以你必须单独同步每个。 除此之外,IP地址是动态的,因此必须进行编辑。 这很乏味,似乎应该有一个更简单的方法。 我错过了什么吗? 有没有办法简化这个过程(可能是一个bash脚本)?

我的建议是解决动态IP的问题(大多数路由器都有地址保留的概念,你可以用来“修复”你的计算机的IP)。 之后,您可以使用命令行版本的unison:

 unison -auto -batch profilename 

您可以将其添加到登录/注销脚本或作为cron作业。

如果您仍需要更改ip,可以在脚本中使用sed

  1. ~/.unisonnewprof.tmpl创建一个模板文件,如下所示:

     root = /home/romano/ root = ssh://romano@MYIPHERE//home/romano/ path = education path = research 
  2. 创建以下脚本,将其sync_newprof

     #!/bin/bash # cd $HOME/.unison cat newprof.tmpl | sed s/MYIPHERE/$1 >! newprof.prf unison -auto -batch profilename 

    基本上,我们创建一个配置文件,用脚本第一个参数更改MYIPHERE字

  3. 现在你可以称之为

     sync_newprof 1.1.1.1 

    它将使用给定的IP和同步创建配置文件。

在本地网络上,您有两台机器可以安全地自动同步/home//Desktop每10分钟:“Host”运行OpenSSH Server,“Client”通过SSH连接到“Host”。

解决方案概述*

  • 在主机上设置OpenSSH服务器
  • 在客户端和主机上安装Unison
  • 创建脚本1,以便cron可以使用的RSA密钥
  • 的crontab中添加两行,然后
  • 将脚本1设置为在启动时运行。

在主机上设置OpenSSH服务器

请参阅设置SFTP服务器以设置OpenSSH服务器,该服务器在主机上侦听SSH连接为 ,使用静态IP,侦听非标准端口,拒绝基于密码的连接,并在Host拥有RSA时允许RSA密钥连接PUBLIC_KEY。

在客户端和主机上安装Unison

在两台机器上运行(如果需要,unison-gtk是GUI):

 sudo apt-get install unison unison-gtk 

创建一个脚本

cron不共享相同的环境,因此无法找到连接到Host所需的客户端RSA密钥。 脚本1将环境提供给的crontab文件。

脚本1还生成脚本2,它每10分钟由的crontab文件执行并运行Unison。

  • 警告! 我不是一个脚本专家并且适应了这个[1]

脚本1(/ /home//Documents/Scripts/set_ssh_env_for_cron_unison.sh

 #!/bin/sh SSH_ENV=$HOME/.ssh/environment_for_cron ## file to be generated SSH_ENV2=$HOME/Documents/Scripts/unison_sync.sh ## Script 2 to be generated function start_agent { echo "Initialising new SSH agent..." env | grep SSH | sed 's/SSH_AUTH_SOCK=//' > ${SSH_ENV} ## send output of env | grep SSH minus "SSH_AUTH_SOCK=" so cron can get output from SSH_ENV ## create a new script with three lines, line 3 is unison command echo "#!/bin/sh" > ${SSH_ENV2} ## line 1 env | grep SSH >> ${SSH_ENV2} ## line 2 echo "/usr/bin/unison /home//Desktop ssh://://home//Desktop -batch -debug update+ -ignore 'Name *.gvfs' -ignore 'Name .cache*' -ignore 'Name [Cc]ache*' -ignore 'Name .thumbnails*' -ignore 'Name [Tt]rash*' -ignore 'Name *.backup*' -ignore 'Name *~' -ignore 'Name .dropbox*' -ignore 'Name /proc/*' -ignore 'Name /sys/*' -ignore 'Name /dev/*' -ignore 'Name /run/*' -ignore 'Name /root/Ubuntu One/*'" >> ${SSH_ENV2} ## line 3 echo succeeded chmod 644 ${SSH_ENV} ## change permissions so cron can read SSH_ENV chmod 775 ${SSH_ENV2} ## change permissions so cron can execute SSH_ENV2 . ${SSH_ENV} > /dev/null ssh-add id_rsa ## unlocks your RSA key and loads it into the ssh-agent which holds keys in memory throughout login session } if [ -f "${SSH_ENV}" ]; then . ${SSH_ENV} > /dev/null ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || { start_agent; } else start_agent; fi 

编辑的crontab以每10分钟执行一次同步

 crontab -e 

现在将以下行附加到的crontab

 SSH_AUTH_SOCK=/home//.ssh/environment_for_cron */10 * * * * /home//Documents/Scripts/unison_sync.sh 
  • 确保新crontab中上面两行后面有一个空白的新行!

使用Ctrl + x退出; y代表“是”; 输入确认。 检查crontab文件:

 crontab -l 

将脚本1设置为在启动时运行

使用Dash > Startup Applications (或Gnome上的Applications > System Tools > Preferences )添加新的启动程序。 如果它显示“Command:”,请输入:

 /home//Documents/Scripts/set_ssh_env_for_cron_unison.sh 

恭喜!

如果一切顺利,您将在客户端登录时输入客户RSA密钥的密码,您无需在整个登录会话期间再次输入密码。 每隔10分钟,客户端将自动与Host协商无密码SSH连接,Unison将同步/home//Desktop//HOST//home//Desktop 。 您的笔记本电脑和台式机现在可以加入神圣同步。

*细节:

我的最终设置使用非标准SSH端口作为 (非root )通信,以静态IP“Host”。 密码validation在“主机”上禁用(需要预先validation的RSA密钥),而“客户端”上的RSA密钥需要密码才能使用(每次登录会话一次)。 因此,攻击者需要猜测正确的端口,RSA密钥和密码,以使用“主机”将 shell 创建为shell。

在每个登录会话输入一个密码后,“客户端”和“主机”每10分钟自动同步一次。 这是我发现使用的RSA密钥和cron的环境工作的方法。**

警告! 当然,如果一台或两台机器都处于脱机,关机等状态,它们将无法同步!

**如果有一个更简单的方法使用属于root客户端的RSA密钥,而不需要使用密码,而Host同时拒绝基于密码的SSH连接,请不要犹豫。