Gostaríamos de usar unison
para sincronizar dois servidores. Na linha de comando e em arquivos bash, o seguinte comando funciona bem:
unison -batch /var/www/html/test ssh://host-2//var/www/html/test
Os arquivos estão sendo sincronizados e unison.log
atualizados. até agora tudo bem.
em combinação com um arquivo de preferências, como .unison/default.prf
e simplesmente executando unison
a partir da linha de comando conforme descritoaqui, as coisas também funcionam bem.
Também instalamos incrond
o daemon cron inotify e ele está funcionando perfeitamente. O seguinte cron job está sendo executado perfeitamente:
/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE touch /root/test
/root/test
está sendo atualizado sempre que faço alterações nos arquivos em/var/www/html/test
Até agora tudo bem! Mas as únicas coisas que não funcionam com o incrontab são:
/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE unison
/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE /usr/bin/unison
/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE /usr/local/sbin/unison
/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE unison -batch /var/www/html/test ssh://host-2//var/www/html/test
/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE /usr/bin/unison -batch /var/www/html/test ssh://host-2//var/www/html/test
/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE /usr/local/sbin/unison -batch /var/www/html/test ssh://host-2//var/www/html/test'
Nada aparece no unison.log
arquivo, muito menos atualizar o servidor remoto. O seguinte também não produz nada.
/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE unison &> /root/test.log
/root/test.log
nem está sendo criado.
Outro teste usando um arquivo em lote chamado sync.sh
também não funciona.
no incrontab:
/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE /root/sync.sh
e em sync.sh
:
#!/bin/bash
touch /root/test
/usr/bin/unison -batch /var/www/html/test ssh://host-2//var/www/html/test
Novamente, /root/test
está sendo tocado muito bem, o que significa que o inofify funciona muito bem toda vez que atualizo um arquivo no /var/www/html/test
, mas novamente nenhum resultado no unison
.
/var/log/cron fica assim:
May 21 06:33:44 Host-1 incrond[28339]: (root) CMD (sh /root/sync.sh)
e o unison.log
não está sendo atualizado.
Conclusões:
inotify
funciona bem, detecta todas as alterações no sistema de arquivos e executa uma tarefa, exceto qualquerunison
tarefa.unison
funciona bem na linha de comando e em lote, exceto quando chamado peloincrond
daemon.
Estou negligenciando alguma coisa?
Responder1
Para estabelecer uma conexão SSH, o cliente precisa se autenticar no servidor. Você provavelmente está usando autenticação baseada em chave, com uma chave armazenada em um arquivo protegido por senha e carregada no agente SSH. O cliente SSH sabe como encontrar o agente por meio da variável de ambiente SSH_AUTH_SOCK
. Em um trabalho cron ou incron, o ambiente não é o mesmo da sua sessão interativa, é mínimo, sem SSH_AUTH_SOCK
, portanto o cliente SSH não pode se conectar à máquina remota.
Se a conexão SSH não puder ser estabelecida, o Unison nem mesmo começará a procurar arquivos para sincronizar e nada será gravado no arquivo unison.log
.
Existem mensagens de erro no erro padrão do script, mas você não as registra em lugar nenhum. Adicione algo parecido exec 2>&1 >>~/.unison-sync.log; date
ao início do seu script.
Para que a conexão SSH funcione, você precisará providenciar que o trabalho Unison tenha acesso ao seu agente ou configurar uma chave sem senha. Se você quiser passar pelo seu agente, consulteNão é possível fazer ssh na máquina remota usando shell script no Crontab; mas só funcionará enquanto você estiver logado. Se quiser que a sincronização funcione o tempo todo, uma chave sem senha é a única solução. Como você está executando o Unison e, portanto, o SSH como root, a chave privada precisa estar em /root/.ssh
, não na sua conta. O mesmo vale para qualquer opção relevante em .ssh/config
. No lado do servidor, você pode autorizar a chave pública apenas para executar um comando uníssono específico com uma command=…
diretiva .ssh/authorized_keys
(consulteCriando uma conta UNIX que executa apenas um comandoPor exemplo). Com uma restrição de comando, se alguém obtiver acesso à conta root local, só poderá executar esse unison …
comando específico host-2
; Não sei se o Unison pode ser induzido a executar código arbitrário dessa maneira.