Para estabelecer uma conexão SSH, o cliente precisa se autenticar no servidor. Você provavelmente está usando a 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 cron ou incron job, o ambiente não é o mesmo que em sua sessão interativa, é bem simples, sem SSH_AUTH_SOCK
, então o cliente SSH não pode se conectar à máquina remota.
Se a conexão SSH não puder ser estabelecida, o Unison nem sequer começará a procurar arquivos para sincronizar e nada será gravado em unison.log
.
Existem mensagens de erro no erro padrão do script, mas você não está registrando-as em lugar algum. Adicione algo como exec 2>&1 >>~/.unison-sync.log; date
ao início do seu script.
Para fazer com que a conexão SSH funcione, você precisará providenciar para que o trabalho em Unison tenha acesso ao seu agente ou para configurar uma chave sem senha. Se você quiser passar pelo seu agente, consulte Não é possível usar o ssh em uma máquina remota usando o shell script no Crontab ; mas só funcionará enquanto você estiver logado. Se você 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 unison específico com uma diretiva command=…
em .ssh/authorized_keys
(consulte Criando uma conta UNIX que apenas executa um comando para um exemplo). Com uma restrição de comando, se alguém obtiver acesso à conta raiz local, ele só poderá executar esse comando unison …
específico em host-2
; Não sei se o Unison pode ser induzido a executar código arbitrário dessa maneira.