Unison - Sincronizar Computadores Automaticamente

5

Existe uma maneira de sincronizar vários computadores (isto é, diretórios particulares na pasta pessoal) automaticamente usando o Unison? Se não, existe uma alternativa que pode fazer isso? Eu não sou completamente contra a abertura do Unison o tempo todo e fazendo a sincronização manualmente, mas quando se abre você deve selecionar um perfil, que corresponde a apenas um diretório, então você tem que sincronizar cada um individualmente. Adicione a isso, o endereço IP é dinâmico e, portanto, deve ser editado. Isso é muito tedioso, e parece que deveria haver um jeito mais simples. Estou esquecendo de algo? Existe uma maneira de simplificar esse processo (possivelmente um script bash)?

    
por Nateowami 08.07.2014 / 10:11

2 respostas

5

Minha sugestão seria resolver o problema do IP dinâmico (a maioria dos roteadores tem o conceito de reserva de endereço, que você pode usar para "consertar" o IP do seu computador). Depois disso, você pode usar a versão de linha de comando do unison:

unison -auto -batch profilename 

e você pode adicioná-lo aos seus scripts de login / logout ou como um cron job.

Se você ainda precisar alterar o ip, use sed em um script:

  1. crie um arquivo de modelo em ~/.unison , newprof.tmpl , assim:

    root = /home/romano/
    root = ssh://romano@MYIPHERE//home/romano/
    
    path = education
    path = research
    
  2. crie o seguinte script, chame-o de sync_newprof :

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

    basicamente, criamos um arquivo de perfil alterando a palavra MYIPHERE com o primeiro argumento do script

  3. agora você pode chamá-lo como

    sync_newprof 1.1.1.1 
    

    e ele criará o perfil com o IP e a sincronização fornecidos.

por Rmano 10.09.2014 / 17:27
2

Em uma rede local, você tem duas máquinas nas quais deseja sincronizar com segurança e automaticamente /home/<username>/Desktop a cada 10 minutos: "Host" que executa seu servidor OpenSSH e "Client", que se conecta por SSH a "Host".

Visão geral da solução *

  • Configurar um servidor OpenSSH no host
  • Instale o Unison no cliente e no host
  • Crie o Script 1 para que cron possa usar a chave RSA de <username>
  • Adicione duas linhas ao crontab de <username> e
  • Defina o script 1 para ser executado na inicialização.

Configurar o OpenSSH Server no Host

Veja Setup SFTP Server para configurar um servidor OpenSSH que escuta para conexões SSH como <username> no Host, usa um IP Estático, escuta em uma porta não padrão, recusa conexões baseadas em senha e permite conexões de chave RSA se o Host possuir a chave pública RSA.

Instale o Unison no cliente e no host

Em ambas as máquinas, execute (unison-gtk é GUI se você quiser):

sudo apt-get install unison unison-gtk

Crie um script

cron não compartilha o mesmo AMBIENTE que <username> e, portanto, não conseguirá localizar a chave RSA do Cliente necessária para se conectar ao Host. O Script 1 fornece esse ENVIRONMENT para o arquivo crontab de <username> .

O script 1 também gera o Script 2, que é executado pelo arquivo crontab do <username> a cada 10 minutos e executa o Unison.

  • CAVEAT! Não sou especialista em scripts e adaptei este [1]

Script 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

Edite o crontab de <username> para executar a sincronização a cada 10 minutos

crontab -e

Agora acrescente as seguintes linhas ao crontab

do <username>
SSH_AUTH_SOCK=/home/<username>/.ssh/environment_for_cron
*/10 * * * * /home/<username>/Documents/Scripts/unison_sync.sh
  • Verifique se há uma nova linha em branco seguindo as duas linhas acima no novo crontab!

Saia com Ctrl + x ; y para "SIM"; Digite para confirmação. Verifique o arquivo crontab:

crontab -l

Definir o Script 1 para ser executado na inicialização

Use Dash > Startup Applications (ou Applications > System Tools > Preferences no Gnome) para adicionar um novo programa de inicialização. Onde diz "Comando:", digite:

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

Parabéns!

Se tudo correu bem, você digitará a senha da chave RSA do Cliente no login do Cliente e não precisará digitar a senha novamente durante a sessão de login. A cada 10 minutos, o Cliente negociará automaticamente uma conexão SSH sem senha, com o Host e o Unison sincronizando /home/<username>/Desktop e //HOST//home/<username>/Desktop . Seu laptop e desktop agora podem ser unidos em síncrona sagrada.

* Detalhes:

Minha configuração final se comunica como <username> (não root ) usando uma porta SSH não padrão para "Host" em um IP estático. A Autenticação de Senha está desabilitada em "Host" (exigindo uma chave RSA pré-autenticada), enquanto a minha chave RSA em "Cliente" requer uma senha para uso (uma vez por sessão de login). Assim, um invasor precisa adivinhar a porta, a chave RSA e a senha corretas para criar um shell como <username> com "Host".

Após essa entrada de senha por sessão de login, "Client" e "Host" se sincronizam automaticamente a cada 10 minutos. Esse foi o método que achei que funcionaria usando a chave RSA de <username> e o cron 's ENVIRONMENT. **

CAVEAT! Claro, se uma ou ambas as máquinas estiverem offline, desligadas, etc., elas não serão sincronizadas!

** Por favor, não hesite em nos informar se existe um método mais simples usando uma chave RSA pertencente a root no Cliente que não requer uma senha para uso enquanto o Host simultaneamente recusa conexões SSH baseadas em senha. / p>     

por jtd 14.11.2014 / 05:01