Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 05/09/2014, à 22:22

abach

Un script de sauvegardes s'appuyant sur rsync

Bonsoir à tous et à toutes,

Ca fait un moment que l'idée me trottait dans la tête alors j'ai fini par m'y atteler. L'idée ? faire un script permettant de faire des sauvegardes au choix totales ou partielles du home de l'utilisateur vers au choix là aussi un disque USB local ou un serveur SSH.

J'ai voulu faire ce script parce que j'en avais besoin, mais aussi pour apprendre un peu mieux à programmer en bash. Je remercie au passage Bruno qui m'a filé un sérieux coup de pouce sur une autre discussion, ici même, au sujet de l'utilisation de rsync hmm

Voici le fruit de mes élucubrations. Il tient en trois fichiers qu'il convient de mettre dans le même répertoire.

svg.sh

#!/bin/bash
# ==============================================================================
# =                                                                            =
# = svg.sh : Alain BACH - Le 04.09.2014                                        =
# =                                                                            =
# ==============================================================================

# Ce script a pour but de permettre à l'utilisateur de faire ses sauvegardes.
# Il est écrit pour fonctionner sur tout type de poste LINUX
# et a été testé sous Ubuntu 14.04 et LinuxMint 17.
#
# Les sauvegardes peuvent être de deux type :
#     - COMPLETES       : TOUT sauf ce qui est précisé.
#     - PARTIELLES      : RIEN sauf ce qui est précisé.
#
# Elles peuvent de plus se faire à deux endroits différents :
#     - LOCAL           : sur un disque externe branché sur un port USB.
#     - DISTANTES       : sur un serveur SSH du réseau.
#                         Dans ce cas, s'il n'y a pas eu échange de clés SSH,
#                         un mot de passe est demandé.
#                         Ceci est VOLONTAIRE, pour des raisons évidentes de sécurité.
#
# La sauvegarde par défaut est : Partielle, Locale.
#
# La partie de gestion des anciennes sauvegardes reste à écrire
# et n'apparaît donc pas dans le présent script.

# =============================================================================
# = Définition des variables à paramétrer                                     =
# = Cette section est la SEULE qui doit être modifiée manuellement            =
# = pour être adaptée à l'environnement de l'utilisateur                      =
# =============================================================================
ciblelocalversion='N'						# 'N' comme New, si le montage USB est de type '/media/$USER'
											# 'O' comme Old, si le montage USB est de type '/media'
											# ATTENTION à bien respecter N ou O en MAJUSCULE
chemin="$HOME/scripts/svg"					# Endroit où se trouve le script
											# Sans le '/' final
ciblelocalvolume='500go'					# Nom du volume USB local
ciblelsshadresse='192.168.1.81'				# Adresse du serveur SSH
ciblesshuser='abach'						# Nom de l'utilisateur SSH
ciblesshchemin='/home/abach/sauvegardes'	# Chemin sur le serveur SSH devant recevoir la sauvegarde
											# Sans le '/' final
cibleradicant='acer'						# Radicant de la sauvegarde

# =============================================================================
# = Définition des cibles de la sauvegarde                                    =
# = Ces deux variables sont calculées à partir des variables précédentes      =
# =============================================================================
if [ $ciblelocalversion = 'N' ]
then 
	ciblelocale="/media/$USER/$ciblelocalvolume"				# Chemin pour une sauvegarde locale de type New
else
	ciblelocale="/media/$ciblelocalvolume"						# Chemin pour une sauvegarde locale de type Old
fi
ciblessh="$ciblesshuser@$ciblelsshadresse:$ciblesshchemin/"		# Chemin pour une sauvegarde vers serveur SSH

# =============================================================================
# = Ecran d'accueil                                                           =
# =============================================================================
clear
echo '-------------------------------------------------------------------------'
echo '- SCRIPT DE SAUVEGARDE UNIVERSEL                                        -'
echo '-                                                                       -'
echo '- La sauvegarde par défaut est : Partielle                              -'
echo '-                                Locale                                 -'
echo '-                                                                       -'
echo '- Ces choix peuvent être modifiés en répondant aux questions suivantes  -'
echo '-                                                                       -'
echo '-------------------------------------------------------------------------'
echo ' '
# =============================================================================
# = Choix de l'utilisateur : type de sauvegarde                               =
# =                          (par défaut 'P' avec un timeout de 5 secondes)   =
# =============================================================================
read -p 'Sauvegarde (C)omplète ou (P)artielle : ' -n 1 -t 5 svgtype
if [ $svgtype = 'c' ] || [ $svgtype = 'C' ]
then
        logtexte='Sauvegarde complète'
		svgtype='full'
else
		logtexte='Sauvegarde partielle'
        svgtype='part'
fi

# =============================================================================
# = Choix de l'utilisateur : cible de sauvegarde                              =
# =                          (par défaut 'L' avec un timeout de 5 secondes)   =
# =============================================================================
echo -e "\n"
read -p 'Sauvegarde (L)ocale ou (S)SH : ' -n 1 -t 5 svgcible
if [ $svgcible = 's' ] || [ $svgcible = 'S' ]
then
        logtexte="$logtexte, vers serveur $ciblelsshadresse"
		svgcible='s'
        svgdest="$ciblesshuser@$ciblelsshadresse:$ciblesshchemin/$cibleradicant-$svgtype"
else
        logtexte="$logtexte, locale"
		svgcible='l'
        svgdest="$ciblelocale/$cibleradicant-$svgtype"
fi

# =============================================================================
# = Définition de la ligne de commande qui sera lancée                        =
# =============================================================================
if [ $svgtype = 'part' ] && [ $svgcible = 'l' ]
then
        # Sauvegarde partielle en local
        svgligne="rsync -ar --delete-after --files-from=$chemin/RsyncInclusion $HOME $svgdest/"
elif [ $svgtype = 'part' ] && [ $svgcible = 's' ]
then
		# Sauvegarde partielle vers SSH
        svgligne="rsync -e ssh -arz --delete-after --files-from=$chemin/RsyncInclusion  $HOME $svgdest/"
elif [ $svgtype = 'full' ] && [ $svgcible = 'l' ]
then
		# Sauvegarde complète en local
        svgligne="rsync -a  --delete-after --exclude-from=$chemin/RSyncExclusion $HOME $svgdest/"
else
		# Sauvegarde complète vers SSH
        svgligne="rsync -e ssh -az --delete-after --exclude-from=$chemin/RSyncExclusion $HOME $svgdest/"
fi

# =============================================================================
# = Affichage des variables (pour le debugging)                               =
# =============================================================================
echo -e '\n-----------------------------------------------------------'
echo "ciblelocalversion : $ciblelocalversion"
echo "ciblelocalvolume  : $ciblelocalvolume"
echo "ciblelsshadresse  : $ciblelsshadresse"
echo "ciblesshuser      : $ciblesshuser"
echo "ciblesshchemin    : $ciblesshchemin"
echo "cibleradicant     : $cibleradicant"
echo "ciblelocale       : $ciblelocale"
echo "ciblessh          : $ciblessh"
echo '-----------------------------------------------------------'
echo "logtexte          : $logtexte"
echo '-----------------------------------------------------------'
echo "svgtype           : $svgtype"
echo "svgcible          : $svgcible"
echo "svgdest           : $svgdest"
echo '-----------------------------------------------------------'
echo "chemin            : $chemin"
echo "svgligne          : $svgligne"
echo '-----------------------------------------------------------' 
clear
# =============================================================================
# = Lancement de la ligne de commande de sauvegarde.                          =
# =============================================================================
echo '-----------------------------------------------------------' > "$chemin/$cibleradicant.$svgtype.log"
echo "Sauvegarde commencée le  "`date "+%d/%m/%Y à %T"`            >> "$chemin/$cibleradicant.$svgtype.log"
echo "$svgligne en cours..."
$svgligne
echo "Sauvegarde terminée  le  "`date "+%d/%m/%Y à %T"`            >> "$chemin/$cibleradicant.$svgtype.log"
echo '-----------------------------------------------------------' >> "$chemin/$cibleradicant.$svgtype.log"
# clear
cat "$chemin/$cibleradicant.$svgtype.log"
echo '-----------------------------------------------------------'
echo "$logtexte terminée"
echo '-----------------------------------------------------------'
rm "$chemin/$cibleradicant.$svgtype.log"

RsyncInclusion qui va contenir les dossiers et fichiers à inclure

.config
.filezilla
.mozilla
.thunderbird
Bureau
Documents
Images
Musique
Téléchargements
Vidéos

RsyncExclusion qui, comme son nom l'indique va contenir les dossiers à exclure

tmp
.Trash
.cache
.PlayOnLinux

Bien sûr ce n'est pas parfait, mais pour moi, le but est atteint : ça marche et j'ai appris pas mal de choses sur la programmation.


Les chiens vous regardent tous avec vénération. Les chats vous toisent tous avec dédain. Il n’y a que les cochons qui vous considèrent comme leurs égaux. - Winston Churchill
Je suis parrain Linux

Hors ligne

#2 Le 05/09/2014, à 22:52

Kooothor

Re : Un script de sauvegardes s'appuyant sur rsync

C'est cool, mais un script de sauvegarde imho ça doit pouvoir être lancé sans user input, par un cronjob.
Une bonne sauvegarde, c'est une sauvegarde qui se fait toute seule au moins une fois par jour.

Hors ligne

#3 Le 05/09/2014, à 22:58

abach

Re : Un script de sauvegardes s'appuyant sur rsync

Je suis d'accord avec toi sur le principe et c'est personnellement ce que je fais chez moi. Là, je me suis placé dans le cas d'une intervention "à l'extérieur", chez des zamis qui ne sont pas aussi soucieux que nous de cet aspect.

En mettant mon propre PC en réseau, je mets à disposition de cette sauvegarde tout à fait temporaire un grand espace disque. Je peux aussi me balader avec un disque USB 3 externe et backuper là dessus.

Je voulais aussi me donner le choix entre la sécurité, chronophage, et le gain de temps au détriment de la pré-citée sécurité.

EDIT : De plus, justement pour ne pas être bloqué par les inputs, j'y ai mis des timeouts de 5 secondes. Sans intervention de l'utilisateur, un choix par défaut est validé.

Dernière modification par abach (Le 05/09/2014, à 23:02)


Les chiens vous regardent tous avec vénération. Les chats vous toisent tous avec dédain. Il n’y a que les cochons qui vous considèrent comme leurs égaux. - Winston Churchill
Je suis parrain Linux

Hors ligne