Unison - 自动同步计算机

Unison - 自动同步计算机

有没有办法使用 Unison 自动同步多台计算机(即主文件夹中的特定目录)?如果没有,有没有其他方法可以做到这一点?我并不完全反对一直打开 Unison 并手动进行同步,但当它打开时,您必须选择一个配置文件,该配置文件仅对应一个目录,因此您必须分别同步每个目录。此外,IP 地址是动态的,因此必须进行编辑。这非常繁琐,似乎应该有一种更简单的方法。我遗漏了什么吗?有没有办法简化这个过程(可能是 bash 脚本)?

答案1

我的建议是解决动态 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 创建配置文件并同步。

答案2

在本地网络上,您有两台机器,您希望/home/<username>/Desktop每 10 分钟安全自动地同步一次:“主机”运行您的 OpenSSH 服务器,而“客户端”通过 SSH 连接到“主机”。

解决方案概述*

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

在主机上设置 OpenSSH 服务器

设置 SFTP 服务器设置一个 OpenSSH 服务器,该服务器在<username>主机上监听 SSH 连接,使用静态 IP,监听非标准端口,拒绝基于密码的连接,并且如果主机拥有 RSA 公钥则允许 RSA 密钥连接。

在客户端和主机上安装 Unison

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

sudo apt-get install unison unison-gtk

创建一个脚本

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

脚本 1 还生成脚本 2,该脚本由<username>的 crontab 文件每 10 分钟执行一次,并运行 Unison。

  • 注意!我不是脚本专家,并且改编了此内容[1]

脚本1(/home/<username>/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/<username>/Desktop ssh://<Host's local IP address>:<Host's listening SSH Port>//home/<username>/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

编辑<username>的 crontab 每 10 分钟执行一次同步

crontab -e

现在将以下几行添加到<username>crontab中

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

Ctrl使用+ x;退出,y表示“YES”;Enter确认。检查 crontab 文件:

crontab -l

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

使用Dash> Startup Applications(或Gnome 上的Applications> System Tools> Preferences)添加新的启动程序。在“命令:”处输入:

/home/<username>/Documents/Scripts/set_ssh_env_for_cron_unison.sh

恭喜!

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

*细节:

我的最终设置是使用非标准 SSH 端口以静态 IP 与“主机”通信<username>(不是)。“主机”上的密码验证已禁用(需要预先验证的 RSA 密钥),而“客户端”上的 RSA 密钥需要密码才能使用(每个登录会话一次)。因此,攻击者需要猜测正确的端口、RSA 密钥和密码才能像“主机”一样创建 shell。root<username>

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

警告!当然,如果一台或两台机器都处于离线、关闭等状态,它们将不会同步!

root**如果有更简单的方法,使用客户端的 RSA 密钥并且不需要密码,同时主机拒绝基于密码的 SSH 连接,请随时告诉我们。

相关内容