La commande rsync est incontournable dans la mise en place des sauvegardes. Une autre fonctionnalitĂ© incontournable est lâutilisation du cron pour automatiser le lancement du « backup ».
Le cas dâusage Ă©tant souvent quelque chose qui tourne ne tourne pas directement sur votre machine, mais sur un serveur et qui va effectuer une sauvegarde sur une troisiĂšme machine. GĂ©nĂ©ralement tous cela se passe donc Ă distance hors dâune surveillance directe.
Si vous avez testĂ© la commande rsync avec succĂšs en utilisant le mĂȘme utilisateur et les mĂȘmes paramĂštres que dans le cron, votre problĂšme est plus certainement liĂ© au cron (et Ă son environnement) quâĂ la commande rsync.
Voici quelques Ă©cueils que vous pourrez rencontrer et comment les Ă©viter.
La commande « rsync »
Lâavantage de rsync est sa vitesse dâexĂ©cution dâune part et le fait quâil soit basĂ© sur ssh dâautre part. rsync permet de faire des copies de dossiers (dâarborescences) entre 2 machines (notĂ© que ce dernier point est une possibilitĂ©, pas une obligation, rsync pouvant ĂȘtre utilisĂ© en local).
Par exemple :
rsync --archive --compress --delete --links --progress --recursive --times --update --verbose -vv /var/www/nextcloud/ admin@192.168.10.221:/share/homes/backups/nextcloud-backup/
La commande « crontab »
La commande crontab permet de manipuler le planificateur de tĂąches qui a le doux nom de cron.
Les principaux usages de crontab :
Syntaxe | Description |
---|---|
crontab -l | Affiche le contenu du fichier crontab de lâutilisateur courant |
crontab -r | Supprime toutes les actions du fichier crontab de lâutilisateur courant |
crontab -e | Ădite les actions du fichier crontab de lâutilisateur courant |
Pour afficher le contenu du fichier crontab dâun autre utilisateur (par exemple : www-data
), utiliser sudo
 :
sudo -u www-data crontab -l
Une action de cron typique ressemble à cela :
*/5 * * * * COMMAND
Le format est le suivant :
minute
hour
jour du mois
mois
jour de la semaine
commande à exécuter
Par exemple :
*/5 * * * * /usr/local/bin/mybackup.sh >>/var/log/apps/mybackup-from-cron.log 2>&1
Pour vous aider à générer la partie date vous pouvez utiliser crontab guru.
« ssh » ou ces dérivés et le « cron »
Lors de la mise au point dâun script utilisant directement ou indirectement ssh (indirectement comme rsync, rcp â qui est obsolĂšte depuis 2019, sftp)
Pensez Ă dĂ©sactiver lâauto-ban, sâil existe, sur le serveur cible le temps de la mise au point. Ceci sâadresse tout particuliĂšrement aux NAS qui intĂšgrent souvent ce type de mĂ©canisme par dĂ©faut.
En cas dâune sĂ©rie dâĂ©chec de connexion, la machine qui tente de se connecter est bannie, ruinant vos tentatives de rĂ©paration du script, voir mĂȘme vous Ă©loignant de la solution.
Les particularités du « cron »
Lâutilisation de taches avec le cron diffĂ©rent dâun appel depuis un terminal ou dâune session ssh :
Les variables $HOME
et $USER
 :
Suivant le cas ces variables ne sont pas initialisĂ©es depuis le cron, si vous en avez besoin, le plus simple est de les tester en dĂ©but de script et Ă©ventuellement de les initialiser vous-mĂȘme comme suit :
if [ -z "${USER:-}" ] ; then
USER="$( id -un )"
fi
declare -gx USER # Rend la variable globale et lâexporte
Pour la variable $HOME
, on doit sâappuyer sur la variable $USER
 :
Attention, la solution simpliste suivante ne fonctionne pas au moins pour les utilisateurs systĂšmes comme www-data
:
HOME="/home/${USER}"
Une solution plus universelle consiste Ă sâappuyer sur /etc/passwd
et sur la variable $USER
 :
if [ -z "${HOME:-}" ] ; then
HOME="$( grep "^${USER}:" /etc/passwd | cut -d':' -f6 )"
fi
declare -gx HOME # Rend la variable globale et lâexporte
-
Remarque
La remarque ci-dessous ne sâapplique pas nĂ©cessairement Ă tous les Linux, ni Ă toutes leur version, cela Ă©tant cette prĂ©caution nâa pas dâeffet nĂ©gatif.
Vous noterez que jâai mis la dĂ©claration globale et lâexport en dehors du
if ⊠fi
, la raison est que lĂ encore lâenvironnement du cron se distingue, certaines variables nâont pas le drapeau « exporté » actif. Certaines commandes ne prennent en compte que les variables exportĂ©es, câest le cas en particulier de : envsubst.
Un shell limité
Le shell utilisĂ© par le cron est sh, pour contourner cela vous devez prĂ©ciser le shell dans la ligne de commande ou mieux appeler un script, qui vous permettra dâinitialiser vos variables.
Pour ma part, je conseille la crĂ©ation dâun script dans presque tous les cas dâusage.
La redirection
*/5 * * * * /usr/local/bin/mybackup.sh >>/var/log/apps/mybackup-from-cron.log 2>&1
Un petit piĂšge avec la redirection est quâil faut sâassurer que lâutilisateur dĂ©fini par le cron ait bien le droit dâĂ©crire le log. Une remarque qui peut sembler Ă©vidente, mais si le fichier de redirection ne peut pas ĂȘtre crĂ©Ă© ou modifier, la tache Ă©chouera en silence.
Les croches pieds avec « rsync » et « ssh » en général
- Le transfert dâagent SSH ou « SSH agent forwarding »
Cette fonctionnalitĂ© nâest gĂ©nĂ©ralement pas active par dĂ©faut, mais elle offre quelques avantages et vous lâavez peut-ĂȘtre activĂ©e volontairement ou au dĂ©tour dâun tutorielâŠ
Sur un petit rĂ©seau, on utilisera le transfert dâagent SSH pour que la clĂ© prĂ©sente sur votre machine (machine administrateur) puisse ĂȘtre rĂ©utilisĂ©e lors du transfert du serveur applicatif vers le serveur de sauvegarde.
Cela implique que la commande de sauvegarde soit lancée depuis une session ssh, et donc cela ne fonctionnera pas depuis le cron.
Dans un milieu professionnel on pourra utiliser le transfert dâagent SSH dans le cadre dâun bastion.
Ici la machine de lâadministrateur nâest pas sur le mĂȘme rĂ©seau que les serveurs. Seul la machine bastion a accĂšs aux deux rĂ©seaux.
LĂ le transfert dâagent SSH prend tout son sens, puisque cela permet de ne pas stocker de clĂ©s sur le bastion.
Les cas d'echec de connexion produisent un erreur du type:
opening connection using: ssh -l admin 192.168.10.221 rsync --server -vvvulogDtprze --delete . /share/homes/backups/nextcloud-backup/config
Permission denied, please try again.
Permission denied, please try again.
admin@192.168.10.221: Permission denied (publickey,password,keyboard-interactive).
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(228) [sender=3.2.3]
[sender] _exit_cleanup(code=12, file=io.c, line=228): about to call exit(255)
Diagnostic du « cron »
Pour voir ce quâil se passe autour du cron, vous pouvez utiliser lâune des commandes suivantes :
La version systemd (la maniĂšre actuelle/âmoderneâ)Â :
journalctl --unit cron.service
Vous pouvez obtenir cette ligne de commande Ă lâaide de : jour<TAB>--uni<TAB>cr<TAB>
La version historique qui peut ne pas fonctionner sur certain Linux :
grep CRON /var/log/syslog
Un type dâerreur dans le cron indique que le diagnostic nâest pas rĂ©ellement possible :
Mar 30 07:40:01 TheHostName CRON[17671]: (CRON) info (No MTA installed, discarding output)
En français : « Aucun agent de transfert de courrier installé, suppression de la sortie »
Cela arrive dans le cas oĂč la sortie est redirigĂ©e vers les mails. Un sujet Ă part entiĂšre trop complexe pour lâaborder dans ce billet. ConcrĂštement, il sâagit dâinstaller un service smtp comme postfix, exim4, ssmtp (facile mais qui nâest plus maintenu), msmtp (simple) ou OpenSMTPD.
Liens
- Over SSH, can you use the same private key on the host side for other purposes?
- How to disable ssh-agent forwarding
- Page wikipedia Mail_Transfer_Agent
- msmtp
- OpenSMTPD
- Cron et crontab : le planificateur de tùches !
- Utilisation d'un bastion
኿