# Script bash et rsnapshot

**URL:** <https://www.debian-fr.org/t/script-bash-et-rsnapshot/30120>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 12:30 UTC](https://www.debian-fr.org/t/script-bash-et-rsnapshot/30120 "2016-02-21T00:30:56Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![LAV-FRED](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/l/da6949/32.png) [@LAV-FRED](https://www.debian-fr.org/u/LAV-FRED)\
**Post date:** [Février 21, 2016, 12:30 UTC](https://www.debian-fr.org/t/script-bash-et-rsnapshot/30120/1 "2016-02-21T00:30:56Z")

</div>

Tout d’abord désolé pour ce post qui est un peu complexe…  
Je ne sais pas où je dois mettre ce topic qui est à cheval entre programmation et support debian… Merci à un admin de le changer si ça ne va pas.

Je souhaite réaliser des sauvegardes de différentes machine sur un serveur ssh avec rsnapshot.

D’abord je tombe sur ceci dans le howto français de rsnapshot :

> [@](#):
>
> Soyez averti, cependant, que si un hôte distant n’est pas accessible pendant une sauvegarde, ca videra le contenu du dernier instantané pour ce point de sauvegarde sur le serveur rsnapshot. Un re-sync complet sera necessaire la prochaine fois que l’hote deviens disponible. Nous espérons corriger ceci dans le futur.

la source :  
[http://rsnapshot.org/howto/1.1/rsnapshot-HOWTO.fr.html#link\_dest](http://rsnapshot.org/howto/1.1/rsnapshot-HOWTO.fr.html#link_dest)

Ce n’est pas sans faire peur alors je veux réaliser un script vérifiant la présence de la machine à sauvegarder sur le réseau local avant de lancer rsnapshot, ainsi que deux ou trois autres commandes. Voici le début de mon script :

[code]#!/bin/bash

# personnaliser rsnapshot.conf

# créer les script hourly, dayly, weekly, mounthly (seule la commande rsnapshot lancée diffère)

# editer la crontab pour lancer script rsnapshot hourly

# script rsnapshot dayly

# script rsnapshot weekly

# script rsnapshot mounthly

# Contenu du script :

# Tester rsnapshot.conf si ok \> suite sinon \> message d’erreur

# Vérifier la présence de la machine à sauvegarder

# Ouvrir le périphérique luks contenant la sauvegarde si erreur \> message d’erreur

# Monter le périphérique chiffré ouvert

# Lister les sauvegardes présentes avant la nouvelle sauvegarde

# Lancer la sauvegarde hourly ou dayly ou weekly ou mounthly suivant le script si erreur \> message d’erreur

# Lister les sauvegardes présentes après la sauvegarde

# Démontage du périphérique chiffré

# Fermeture du périphérique luks

# Tester le fichier conf de rsnapshot

result=`rsnapshot configtest`  
if [«&nbsp;$result&nbsp;» = «&nbsp;Syntax OK&nbsp;»]  
then  
# ouverture du périphérique chiffré  
cryptsetup luksOpen /dev/disk/by-uuid/ba9e76b3-2f65-4f7f-aa69-285223dbced6 rsnapshot \< /home/rsnapshot/input.txt

```
# montage périphérique chiffré contenant la sauvegarde
mount -t ext3 /dev/mapper/rsnapshot /mnt/rsnapshot/ 

# vérifier la présence de la machine # ping -c 1 <IP> ? si erreur > message d'erreur
if [présence de la machine]
then
# lister les sauvegardes présentes sur le périphérique
ls -l /.snapshots/ > /.snapshots/snapshot.txt

# lancer la sauvegarde (horaire par exemple)
rsnapshot hourly

# lister les sauvegardes présentes sur le périphérique
ls -l /.snapshots/ > /.snapshots/snapshot.txt

else
echo "La machine à sauvegarder n'est pas connectée"
fi

# démontage du périphérique chiffré
umount /mnt/rsnapshot

# fermeture du volume chiffré
cryptsetup luksClose rsnapshot

```

else  
echo «&nbsp;Le fichier de configuration de rsnapshot contient des erreurs&nbsp;»  
fi  
[/code]

le premier problème est de savoir si la machine à sauvegarder est connectée, est ce que le test d’un ping est suffisant ? Exemple :

```auto
ping -c 1 <IP>
```

Ensuite je vais devoir créer un script par commande rsnapshot avec chacun comme argument hourly, daily, weekly et mounthly.  
Y a t il un moyen de tout centraliser ?

Dernier problème : je vais avoir 3 machine à sauvegarder sur le serveur (sûrement plus à long terme…), or les machine à sauvegarder sont indiquées dans rsnapshot.conf. Si je met les trois machines, il faudra que les trois soient connectées en même temps lors des backup (ce qui ne sera sans doute pas le cas), ou alors est ce que je peux utiliser l’option :

`-c path to alternate config file`, et créer dans ce cas un fichier conf par machine + les scripts hourly, daily, weekly et mounthly s’y rapportant ?  
Dans ce cas ça devient très vite lourd ☹ ou y a t il une solution plus simple de régler mon problème ?

---

<div class="post-metadata">

**Author:** ![fran.b](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/f/d78d45/32.png) [@fran.b](https://www.debian-fr.org/u/fran.b)\
**Post date:** [Février 21, 2016, 12:30 UTC](https://www.debian-fr.org/t/script-bash-et-rsnapshot/30120/2 "2016-02-21T00:30:57Z")

</div>

C’est amusant car moi je traiterais le problème différemment en mettant la commande de backup sur les machines elle même et en utilisant rsync (largement plus souple).

`0 5 * * * root rsync -P -av --del --exclude-from=/etc/NOSYNC / serveurbackup:/var/backup/machine > /dev/null
`

Tu peux éventuellement mettre un cron sur la machine client qui lance un rsnapshot sur la machine de backup.

Sinon

`if /bin/ping -c 1 machine > /dev/null 2> /dev/null; then
[OK]
else
[PAS de machine]
fi
`marche effectivement bien

---

<div class="post-metadata">

**Author:** ![LAV-FRED](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/l/da6949/32.png) [@LAV-FRED](https://www.debian-fr.org/u/LAV-FRED)\
**Post date:** [Février 21, 2016, 12:30 UTC](https://www.debian-fr.org/t/script-bash-et-rsnapshot/30120/3 "2016-02-21T00:30:58Z")

</div>

> [@fran.b](#):
>
> C’est amusant car moi je traiterais le problème différemment en mettant la commande de backup sur les machines elle même et en utilisant rsync (largement plus souple).

J’utilise déjà un mix de rdiff-backup et du T&A de Ricardo sur rsync pour les sauvegardes de mon portable  
[http://www.debian-fr.org/script-bash-et-test-de-fichier-t31225.html](http://www.debian-fr.org/script-bash-et-test-de-fichier-t31225.html)  
Visiblement rsnapshot offre un avantage de fiabilité, de configuration simple (peut être pas dans mon cas ![:116](https://www.debian-fr.org/uploads/default/original/1X/eae5ac515968d1af3d7141407139e6921afb85d3.gif "heu!") ) et de pouvoir passer simplement par ssh.  
En effet il serait par contre plus simple qu’il s’exécute sur la machine à sauvegarder et non sur le serveur…  
Est ce possible de faire passer par ssh la méthode de ricardo ?

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 12:30 UTC](https://www.debian-fr.org/t/script-bash-et-rsnapshot/30120/4 "2016-02-21T00:30:58Z")

</div>

Avec l’option -D de ssh et éventuellement tsocks tu peut faire passer tout et n’importe quoi par ssh.  
(et je crois que l’option -C permet de compresser les données transmises)

---

<div class="post-metadata">

**Author:** ![LAV-FRED](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/l/da6949/32.png) [@LAV-FRED](https://www.debian-fr.org/u/LAV-FRED)\
**Post date:** [Février 21, 2016, 12:30 UTC](https://www.debian-fr.org/t/script-bash-et-rsnapshot/30120/5 "2016-02-21T00:30:59Z")

</div>

Autant pour moi fran.b, j’ai lu ton post un peu trop vite tout à l’heure (vraiment trop…), mettre un cron sur la machine client qui exécute rsnapshot avec son fichier de conf personnalisé est une très bonne solution, je vais expérimenter de ce côté là…

@MisterFreez je savais que l’on pouvait créer un «&nbsp;tunnel&nbsp;» ssh entre deux machine pour faire à peu près n’importe quoi mais c’est plus que la mise en oeuvre soit à mon niveau qui m’inquiète dans ce genre d’opérations ![:mrgreen:](https://www.debian-fr.org/uploads/default/original/1X/cc83e9b583138e48ff45f96609046b06d06c7f9d.gif "Mr. Green")

Merci à vous !

---

<div class="post-metadata">

**Author:** ![LAV-FRED](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/l/da6949/32.png) [@LAV-FRED](https://www.debian-fr.org/u/LAV-FRED)\
**Post date:** [Février 21, 2016, 12:31 UTC](https://www.debian-fr.org/t/script-bash-et-rsnapshot/30120/6 "2016-02-21T00:31:02Z")

</div>

Bon alors finalement je comptais procéder de la manière suivante :

- 1 rsnapshot.conf spécifique à chaque machine à suvegarder sur le serveur
- 1 script par machine à sauvegarder sur le serveur exécutant ceci :  
- test de rsnapshot.conf  
- ouverture du périphérique luks  
- montage du périphérique chiffré ouvert  
- liste des sauvegardes présentes avant la sauvegarde  
- lancer la sauvegarde rsnapshot au travers de ssh (autentification par clé)  
- lister les sauvegardes présentes  
- démonter le périphérique chiffré  
- fermer le périphérique luks
- le script est lancé (suivant les conseils de fran.b) par ssh depuis la crontab de la machine client (donc plus de problème de connexion ou non du client)

C’était trop beau :

[quote]En plus des chemins complet vers le système de fichier local, vous pouvez aussi sauvegarder dse systèmes distant en utilisant rsync dans ssh. Si vous avez installé et activé ssh (via le paramètre cmd\_ssh), vous pouvez specifier un chemin comme ceci :

backup [root@example.com](mailto:root@example.com):/etc/ [example.com/etc/](http://example.com/etc/)

Le comportement est fondamentalement le même mais vous devez prends quelques choses en plus en compte.

```
*

  Le serveur ssh doit tourner sur example.com[/quote] 

```

source howto de rsnapshot  
Le problème est que si sur le réseau local je connais l’ip (locale) de chacune de mes machines seule celle du serveur est configurée en fixe, et j’ai besoins d’indiquer l’ip du client et non celle du serveur ds le rsnapshot.conf, ce qui n’est pas impossible mais peu pratique.  
De plus si je veux faire des sauvegardes de mon portable à distance (ce qui est le but) alors ça devient ingérable, même si je connais l’ip publique de mon serveur il me sera impossible de connaitre comment accéder au client ☹ on m’a conseiller de configurer un VPN mais ça dépasse mon domaine de compétence…  
Si vous avez une solution… sinon je modifie mon script avec rdiff backup pour qu’il passe par ssh et je n’ai plus besoins de connaitre les “coordonnées” de ma machine client.

Merci à vous ! 😃

---

<div class="post-metadata">

**Author:** ![kna](https://www.debian-fr.org/user_avatar/www.debian-fr.org/kna/32/5623_2.png) [@kna](https://www.debian-fr.org/u/kna)\
**Post date:** [Février 21, 2016, 12:31 UTC](https://www.debian-fr.org/t/script-bash-et-rsnapshot/30120/7 "2016-02-21T00:31:03Z")

</div>

Si tu veux mettre rsnapshot sur chaque machine à sauvegarder, tu peux monter le répertoire de sauvegarde du serveur via sshfs (fuse). Du coup ça te permet de tester facilement la connexion :

```auto
if sshfs root@serveur:/backups/machine1 /.snapshots ; then
    rsnapshot daily
else
    # le système d'alerte que tu veux (mailx, xmessage, log, alarme sonore,...)
fi
```

Celà dit, personnellement, si c’est pour configurer une sauvegarde sur chaque machine, j’utiliserais rsync directement. rsnapshot permettant surtout de centraliser la configuration des sauvegardes en un point…

---

<div class="post-metadata">

**Author:** ![LAV-FRED](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/l/da6949/32.png) [@LAV-FRED](https://www.debian-fr.org/u/LAV-FRED)\
**Post date:** [Février 21, 2016, 12:31 UTC](https://www.debian-fr.org/t/script-bash-et-rsnapshot/30120/8 "2016-02-21T00:31:03Z")

</div>

Finalement j’ai repris le script que j’avais fait pour une sauvegarde sur un HDD externe chiffré (moitié rdiffbackup et moitié tuto de ricardo 😉 ) et je l’ai adapté à une utilisation par ssh, la sauvegarde se faisant ds un dossier chiffré sur le serveur (comme ça chaque machine à sauvegarder a sa propre backup chiffrée sur le serveur donc non accessible par quelqu’un d’autre n’ayant pas la passphrase).  
Le problème (si s’en est un) est que je dois ouvrir plusieurs sessions ssh dans mon script :

- une pour associer mon dossier à un périphérique loop, le déchiffrer avec luksOpen, le monter, faire ma liste des backup présentes
- une pour faire la liste des backup présentes après la dernière et démonté et rechiffrer mon dossier

Voici ce que donne mon script (je n’ai pas encore testé :

[code]#!/bin/bash

# ouverture d’une session ssh sur le serveur (autentification par clé rsa)

ssh [mon\_user@192.168.1.3](mailto:mon_user@192.168.1.3):/home

# association du fichier à un périphérique boucle :

losetup /dev/loop0 bcpanolis.img

# ouverture du périphérique chiffré (saisie manuelle du mot de passe)

cryptsetup luksOpen /dev/loop0 bcpanolis

# montage du périphérique chiffré ouvert

mount -t ext3 /dev/mapper/bcpanolis /mnt/bcpanolis

# faire une liste des sauvegarde présentes avant la nouvelle sauvegarde et en écrivant les erreurs sur le serveur

rdiff-backup -l /mnt/bcpanolis/backup \> /mnt/bcpanolis/oldbackup.txt 2\>&1

# clore la session ssh

exit

# faire une nouvelle sauvegarde, via ssh autentification par clé, sortie avec erreurs ds un nouveau fichier (sur le client)

rdiff-backup --exclude-globbing-filelist /home/rdiff-backup/exclude.txt --exclude-sockets /home/mon\_user/ [mon\_user@192.168.1.3](mailto:mon_user@192.168.1.3):/mnt/bcpanolis/backup \> /home/rdiff-backup/rdiffbackup.txt 2\>&1

# effacer les sauvegardes vieilles de plus d’un mois, sortie avec erreurs completant le fichier existant

rdiff-backup --remove-older-than 1M --force [mon\_user@192.168.1.3](mailto:mon_user@192.168.1.3):/mnt/bcpanolis/backup \>\> /home/rdiff-backup/rdiffbackup.txt 2\>&1

# ouverture d’une session ssh sur le serveur (autentification par clé rsa)

ssh [mon\_usere@192.168.1.3](mailto:mon_usere@192.168.1.3):/home

# faire une liste des sauvegarde présentes après la nouvelle sauvegarde et en écrivant les erreurs

rdiff-backup -l /mnt/bcpanolis/backup \> /mnt/bcpanolis/backup.txt 2\>&1

# vérification de la présence du dossier /media/r-diff/backuproot (pour la sauvegarde système)

```
    if [! -e /mnt/bcpanolis/backuproot]; then
    mkdir /mnt/bcpanolisf/backuproot
    fi

```

# clore la session ssh

exit

# sauvegarde du système :

# vérification de la présence du dossier /home/controle/ (sur la machine client)

```
    if [! -e /home/controle]
    then
    mkdir /home/controle
    fi

    # vérification de la présence du dossier /root/exclure 
    if [! -e /root/exclure]
    then
    echo "Erreur : le fichier /root/exclure n'existe pas, impossible de déterminer les fichiers à exclure de la sauvegarde"
    fi

```

# vidange du contenu du dossier temporaire /home/controle/

rm -r /home/controle/\* /home/controle/.\*

# sauvegarde du système par ssh autentification par clé

rsync -av --del --backup --backup-dir=/home/controle/ --exclude-from=/root/exclure / [mon\_user@192.168.1.3](mailto:mon_user@192.168.1.3):/mnt/bcpanolisf/backuproot \> /home/rdiff-backup/backuproot.txt 2\>&1

# ouverture d’une session ssh sur le serveur (autentification par clé rsa)

ssh [mon\_user@192.168.1.3](mailto:mon_user@192.168.1.3):/home

# démontage du périphérique chiffré ouvert

umount /mnt/bcpanolis

# fermeture du périphérique chiffré

cryptsetup luksClose bcpanolis

# détachement de bcpanolis.img du périphérique boucle

losetup -d /dev/loop0

# clore la session ssh

exit  
[/code]  
Je pense que je vais devoir écrire ce script avec mon IP locale ds une première version et avec mon nom de domaine [dyndns.org](http://dyndns.org) (j’ai une ip dynamique) ds une deuxième : je ne pense pas pouvoir utiliser mon nom de domaine [dyndns.org](http://dyndns.org) en local…

Je suis preneur de vos avis sur tout ça 😃  
Merci à vous !
