Ejecutando Unison con incrond (inotify cron daemon)

Ejecutando Unison con incrond (inotify cron daemon)

Nos gustaría utilizarlo unisonpara sincronizar dos servidores. Desde la línea de comando y en archivos bash, el siguiente comando funciona bien:

unison -batch /var/www/html/test ssh://host-2//var/www/html/test

Los archivos se están sincronizando y unison.logactualizando. Hasta ahora, todo bien.

en combinación con un archivo de preferencias, como .unison/default.prfy simplemente ejecutando unisondesde la línea de comando como se describeaquí, las cosas también funcionan bien.

También instalamos incrondel demonio cron inotify y está funcionando sin problemas. El siguiente trabajo cron se ejecuta correctamente:

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE touch /root/test

/root/testse actualiza cada vez que hago cambios en los archivos en/var/www/html/test

¡Hasta ahora, todo bien! Pero las únicas cosas que no funcionan con incrontab son:

/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'

No se muestra nada en el unison.logarchivo, y mucho menos la actualización del servidor remoto. Lo siguiente tampoco genera nada.

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE unison &> /root/test.log

/root/test.logni siquiera se está creando.

Otra prueba que utiliza un archivo por lotes denominado sync.shtampoco funciona.

en la pestaña incron:

/var/www/html/test IN_MODIFY,IN_ATTRIB,IN_CREATE /root/sync.sh

y en sync.sh:

#!/bin/bash

touch /root/test
/usr/bin/unison -batch /var/www/html/test ssh://host-2//var/www/html/test

Nuevamente, /root/testse está tocando muy bien, lo que significa que inofify funciona muy bien cada vez que actualizo un archivo en /var/www/html/test, pero nuevamente no obtiene ningún resultado unison.

/var/log/cron tiene este aspecto:

May 21 06:33:44 Host-1 incrond[28339]: (root) CMD (sh /root/sync.sh)

y unison.logno se actualiza en absoluto.

Conclusiones:

  1. inotifyfunciona bien, detecta cada cambio en el sistema de archivos y ejecuta una tarea, excepto cualquier unisontarea.
  2. unisonfunciona bien desde la línea de comando y por lotes, excepto cuando lo llama el incronddemonio.

¿Estoy pasando por alto algo?

Respuesta1

Para establecer una conexión SSH, el cliente debe autenticarse en el servidor. Probablemente esté utilizando autenticación basada en claves, con una clave almacenada en un archivo protegido con contraseña y cargada en el agente SSH. El cliente SSH sabe cómo encontrar el agente a través de la variable de entorno SSH_AUTH_SOCK. En un trabajo cron o incron, el entorno no es el mismo que en su sesión interactiva, es bastante mínimo, sin archivos SSH_AUTH_SOCK, por lo que el cliente SSH no puede conectarse a la máquina remota.

Si no se puede establecer la conexión SSH, Unison ni siquiera comienza a buscar archivos para sincronizar y no se escribe nada en el archivo unison.log.

Hay mensajes de error en el error estándar del script, pero no los registra en ninguna parte. Agregue algo como exec 2>&1 >>~/.unison-sync.log; dateal comienzo de su guión.

Para que la conexión SSH funcione, deberá hacer arreglos para que el trabajo de Unison tenga acceso a su agente o configurar una clave sin contraseña. Si desea recurrir a su agente, consulteNo se puede acceder por ssh a una máquina remota usando un script de shell en Crontab; pero solo funcionará mientras estés conectado. Si quieres que la sincronización funcione todo el tiempo, una clave sin contraseña es la única solución. Dado que está ejecutando Unison y, por lo tanto, SSH como root, la clave privada debe estar en /root/.ssh, no en su cuenta. Lo mismo ocurre con cualquier opción relevante en .ssh/config. En el lado del servidor, puede autorizar la clave pública solo para ejecutar un comando unísono específico con una command=…directiva en .ssh/authorized_keys(verCrear una cuenta UNIX que solo ejecuta un comandopara un ejemplo). Con una restricción de comando, si alguien obtiene acceso a la cuenta raíz local, solo podrá ejecutar ese unison …comando específico en host-2; No sé si se puede engañar a Unison para que ejecute código arbitrario de esa manera.

información relacionada