Problema de Rsync con cron y no hay problema manualmente

Problema de Rsync con cron y no hay problema manualmente

Tengo un archivo backup.sh que inicia un comando rsync. Este rsync es para hacer una copia de seguridad de mi servidor dedicado en una RaspberryPi que ejecuta raspbian.

(Yo uso un llavero, así que no necesito escribir ninguna contraseña, etc.)

El problema es que cuando lanzo el lote manualmente todo funciona, pero cuando es crontab (con el mismo usuario) me sale el siguiente error:

2013/10/07 19:36:02 [6456] rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
2013/10/07 19:36:02 [6456] rsync error: error in rsync protocol data stream (code 12) at io.c(605) [Receiver=3.0.9]

Aquí está mi archivo backup.sh

#!/bin/bash

echo "_ backup start "$(date +%H:%M:%S)
echo " "

/usr/bin/rsync -avh --rsync-path='/usr/bin/rsync' --delete --log-file='/home/user/rsync.'$(date +%d%m%Y-%H%M%S)'.log' --rsh='ssh -p 1234' [email protected]:/path/to/archives/ /media/backup/

echo " "
echo "_ backup end "$(date +%H:%M:%S)

Y ahora la línea crontab (crontab -e)

# m h  dom mon dow   command
 30 5  *   *   *     /home/user/backup.sh | mail -s "Backup RPi "$(date +\%d/\%m/\%Y-\%X) [email protected]

Saludos

Respuesta1

(Yo uso un llavero, así que no necesito escribir ninguna contraseña, etc.)

Bien, entonces debes decirle al programa que se ejecuta en tu trabajo cron cómo encontrar tu llavero.

SSH busca un agente SSH (que emula el llavero) a través de la variable de entorno SSH_AUTH_SOCK. Por lo tanto, debe configurar esta variable de entorno en su crontab.

En una configuración típica, SSH_AUTH_SOCKes una ruta a un socket con un nombre aleatorio. Dado que está utilizando llavero, puede encontrar fácilmente un nombre alternativo para ese socket: llavero escribe archivos ~/.keychainque contienen declaraciones de variables de entorno que configuran SSH_AUTH_SOCKy otras variables similares ( SSH_AGENT_PID, GPG_AGENT_INFO). Así que simplemente incluya el archivo apropiado en su trabajo cron.

[email protected]
30 5  *   *   *     . ~/.keychain/$(hostname)-sh; /home/user/backup.sh

(Aparte: cron tiene una función incorporada para enviar correo con el resultado del trabajo, de modo que reciba un correo solo si el trabajo produce algún resultado. No es necesario jugar con | mail.)

Respuesta2

La conexión ssh no funciona desde el cronjob. ¿Cómo se supone que debe realizar la autenticación SSH? No se ve ningún intento de enumerar una clave de identidad o contraseña. Colocaría una '-i' con la ruta a su clave (sin contraseña...) si así es como funciona. Las principales diferencias entre la línea de comando y el cronjob tienden a deberse al entorno (ambas cosas, como las variables de entorno, la falta de una terminal de control, etc.)

Respuesta3

Creo que tienes un problema de citas sobre tu tema:

mail -s "Backup RPi "$(date +\%d/\%m/\%Y-\%X) [email protected]

Debería ser esto:

mail -s "Backup RPi $(date +\%d/\%m/\%Y-\%X)" [email protected]

Enfoque alternativo

También incluiría el correo electrónico en el script.

#!/bin/bash

(
  echo "_ backup start "$(date +%H:%M:%S)
  echo " "

  /usr/bin/rsync -avh --rsync-path='/usr/bin/rsync' --delete \
     --log-file='/home/user/rsync.'$(date +%d%m%Y-%H%M%S)'.log' \
     --rsh='ssh -p 1234' [email protected]:/path/to/archives/ /media/backup/

  echo " "
  echo "_ backup end "$(date +%H:%M:%S)
) | mail -s "Backup RPi $(date +\%d/\%m/\%Y-\%X)" [email protected]

Luego cambie la entrada del crontab a esto:

30 5  *   *   *     /home/user/backup.sh

También asegúrese de que la cuenta que ejecuta este cron pueda enviar correo electrónico. Haz una prueba.

información relacionada