Shell script di backup – SMB di Windows / Linux Server

preparare

  • copiare tutti i file in una cartella
  • modificare backup-start.sh con il percorso e configurazioni
  • fare una partizione btrfs
  • creare un volume secondario per il percorso di backup
  • creare un cronjob

inizio

backup-start.sh quotidiano
settimanale backup-start.sh

modalità di backup

  • smb
  • SSHS
  • sshnosymlink
  • sshsudoftp

backup-start.sh

#!/bin / bash
# controllare lo script di backup se il suo funzionamento e, se sì allora CALC per un'istantanea
script_name = / home / backup / backup-script.sh
email_admin=mail1@mail.de,mail2@mail.de
backup_path = / srv / backup / fatto
snapshot_path = / srv / backup / snapshot / backup-$(date +% Y-% m-% d-% H-% M)
snapshot_script = / home / EIT / backup / services-snapshots.sh

## Avviare Script

Se [ -da "$1" ];poi
 eco "nessun insieme di destinazione"
 Uscita 1
altro
 #eco "obiettivo fissato"
 backup_mode = $ 1
fi

## Funzione per i codici errpr
check_error(){
 Se [ "$1" -dare "100" ]; poi
 eco "Inizio - Backup ancora in corso"
 Uscita 1
 fi
 Se [ "$1" -eq "10" ]; poi
 eco "Inizio - Backup fatto - nessun documento"
 MODE = $ backup_mode $ snapshot_script $ backup_local_path / $ server $ snapshot_local_path / $ server
 altro
 Se [ "$1" -eq "0" ]; poi
 eco "Inizio - Backup fatto - con i file"
 MODE = $ backup_mode $ snapshot_script $ backup_local_path / $ server $ snapshot_local_path / $ server
 fi
 fi
}

script_start(){
 Se [ ! -d "$backup_local_path / $ server" ]; poi
 eco "cartella di backup non esiste"
 btrfs sottovolume creare $ backup_local_path / $ server
 chmod 740 $backup_local_path / $ server
 eco "cartella di backup creata"
 altro
 eco "cartella di backup esiste"
 fi
}

##
# eseguire script di backup
##

server = mysvwe1
script_start
sh $ nome_script $ email_admin $ server / path / to / backup / dati $ backup_local_path la password SSH nome utente
error_now = $?
check_error $ error_now

Uscita 0

backup-script.sh

#!/bin / bash
#
# Thomas Mosandl - 2014-11-14
#
# apt-get install CIFS-utils sendmail-bin
# sendmail config
#
# definire il parametro #!/bin / sh
# definire parameterss
## variabili
## 1. mail a
## 2. backup_source_ip
## 3. backup_source_path
## 4. backup_dest_path

backup_source_ip = $ 2
backup_source_path = $ 3
backup_source_user = $ 6
backup_source_domain = 'ASD'
backup_source_pw = $ 7
backup_log_path = / var / log
backup_check_client_ping ="1"
backup_service = $ 5
backup_dest_path = $ 4 / $ backup_source_ip
backup_log_path = / var / log
backup_log_file = backup_ $ backup_source_ip
backup_email_to_config ="thomas.mosandl@mosandl.eu"
backup_email_from ="backup@mosandl.eu"

# config fine

eco "Avvia backup - $backup_source_ip"

# controllo vaiable
se [ -da "$1" ];poi
        eco "elettronica impostata su config"
        backup_email_to ="$backup_email_to_config"
altro
        eco "mail impostato al parametro"
        backup_email_to = $ 1
fi
# controllare la destinazione iSCSI


#ping -q -c $ backup_check_client_ping $ backup_iscsi_target_1 > /dev / null
#Se [ ! $? -eq 0 ]; poi
#	eco "ISCSI Ping non availible"
#	eco " "  | -s posta "di riserva - ISCSI - Ping non funziona" -un "Da parte di: $backup_email_from" $backup_email_to
#	Uscita 1
#altro
#	#Se [ $(iscsiadm sessione -m | grep -c "$backup_iscsi_target_1") -eq 0 ]; poi
	#	eco "ISCSI Monte non availible"
	#	eco " "  | -s posta "di riserva - ISCSI - Monte non funziona" -un "Da parte di: $backup_email_from" $backup_email_to
	#	Uscita 1
	#altro
#		eco "ISCSI è ok"
	#essere
#fi

#192.168.144.167
# verificare se il backup è in esecuzione
ps aux > /tmp / temp.txt
Se [ $(cat /tmp/temp.txt  | grep -c "ssh -o StrictHostKeyChecking = no -l")  -gt 0 ]; poi
	eco "backup è stato rotto o non è in esecuzione"
	Se [ -f "$backup_log_path / $ backup_log_file.lck" ]; poi
rm-rf "$backup_log_path / $ backup_log_file.lck"
	fi
fi
rm -rf /tmp/temp.txt

Se [ -f "$backup_log_path / $ backup_log_file.lck" ]; poi
		eco " "  | -s posta "di riserva - $backup_source_ip - Backup è ancora in esecuzione"  -R $ backup_email_from $ backup_email_to
		eco "copione - backup è in esecuzione"
		set -e
		Uscita 100
altro
	eco "copione - backup non è ancora in esecuzione"
	toccare "$backup_log_path / $ backup_log_file.lck"
fi

# controllare se log è in logrotate

Se [ $(grep -c "$backup_log_path / $ backup_log_file" /etc / logrotate.d / rsyslog)  -eq 1 ]; poi
	eco "copione - rsyslog è impostato"
altro
	eco "$backup_log_path / $ backup_log_file {}" >> /etc / logrotate.d / rsyslog
	eco "copione - rsyslog creato"
fi

#
Se [ ! $(montare | grep -c "/media / DATA0 tipo / srv / backup btrfs (rw)")  -eq 0 ]; poi
	eco "stoccaggio non montato"
	Uscita 11
	eco " "  | -s posta "di riserva - stoccaggio non montato"  -R $ backup_email_from $ backup_email_to
altro
	eco "stoccaggio è montato"
fi

# creare cartelle

# controllare dir di backup
Se [ ! -d "$backup_dest_path" ]; poi
      eco "cartella di backup non esiste"
      mkdir -p $ backup_dest_path
      chmod 740 $backup_dest_path
      eco "cartella di backup creata"
altro
      eco "cartella di backup esiste"
fi


Se [ ! -d "$backup_log_path" ]; poi
      eco "cartella di registro di backup non esiste"
      mkdir -p $ backup_log_path
      eco "cartella di registro di backup creato"
altro
      eco "cartella di registro di backup esiste"
fi





# controllo nslookup
nslookup $ backup_source_ip > /dev / null
Se [ ! $? -eq 0 ]; poi
	eco "DNS non funziona per $ backup_source_ip"
	eco " "  | -s posta "di riserva - $backup_source_ip - nslookup non funziona per $ backup_source_ip"  -R $ backup_email_from $ backup_email_to
rm-rf "$backup_log_path / $ backup_log_file.lck"
	set -e
	Uscita 1
altro
	eco "DNS è ok"
fi


# controllo ping
Se [ ! $backup_source_ip = "server.de" ]; poi
ping -q -c $ backup_check_client_ping $ backup_source_ip > /dev / null
		Se [ ! $? -eq 0 ]; poi
		eco "PING non funziona per $ backup_source_ip"
		eco " "  | -s posta "di riserva - $backup_source_ip - ping $ backup_source_ip non funziona"  -R $ backup_email_from $ backup_email_to
rm-rf "$backup_log_path / $ backup_log_file.lck"
		set -e
		Uscita 1
	altro
		eco "Ping è ok"
	essere
essere

# rsync
echo $ backup_service
Se [ $backup_service = SSH ]; poi
exit_code ="0"
	log_file_temp = $ backup_log_file_ $(date +% Y_% M_% d_% H_% M_% S)
	export SSHPASS = $ backup_source_pw
ionice -c 3 rsync -rptgoDvzLKh --delete --rsh ="/usr / bin / sshpass -e ssh -o StrictHostKeyChecking = no -l $ backup_source_user " $backup_source_ip:$backup_source_path $ backup_dest_path --log-file = $ backup_log_path / $ log_file_temp --stats >> $backup_log_path / $ log_file_temp
	Se [ ! $? -dare 0 ]; poi
		eco "errore di backup - $?"
		cat -v $ backup_log_path / $ backup_log_file | -s posta "di riserva - $backup_source_ip - Backup Errore - $?" -un "Da parte di: $backup_email_from" $backup_email_to
set -e
		Uscita 1
	altro
		eco "Backup è ok"
		Se [ ! $(grep -c "Numero di file creati: 0" $backup_log_path / $ log_file_temp) -eq 0 ]; poi
-s posta "di riserva - $backup_source_ip - fatto Backup - nessun documento" -R $ backup_email_from $ backup_email_to < $backup_log_path / $ log_file_temp
			 eco "copione - nessun documento"
			 exit_code ="10"
		 altro
cat -v $ backup_log_path / $ log_file_temp | -s posta "di riserva - $backup_source_ip - fatto Backup"  -R $ backup_email_from $ backup_email_to
fi
cat $ backup_log_path / $ log_file_temp >>  $backup_log_path / $ backup_log_file
rm $ backup_log_path / $ log_file_temp
fi
Elif [ $backup_service = sshnosymlink ]; poi
exit_code ="0"
	 log_file_temp = $ backup_log_file_ $(date +% Y_% M_% d_% H_% M_% S)
	 export SSHPASS = $ backup_source_pw
ionice -c 3 rsync -rptgoDvzlKh --delete --rsh ="/usr / bin / sshpass -e ssh -o StrictHostKeyChecking = no -l $ backup_source_user " $backup_source_ip:$backup_source_path $ backup_dest_path --log-file = $ backup_log_path / $ log_file_temp --stats >> $backup_log_path / $ log_file_temp
	 Se [ ! $? -dare 0 ]; poi
		 eco "errore di backup - $?"
		 cat -v $ backup_log_path / $ backup_log_file | -s posta "di riserva - $backup_source_ip - Backup Errore - $?" -un "Da parte di: $backup_email_from" $backup_email_to
set -e
		 Uscita 1
	 altro
		 eco "Backup è ok"
		 Se [ ! $(grep -c "Numero di file creati: 0" $backup_log_path / $ log_file_temp) -eq 0 ]; poi
-s posta "di riserva - $backup_source_ip - fatto Backup - nessun documento" -R $ backup_email_from $ backup_email_to < $backup_log_path / $ log_file_temp
			 eco "copione - nessun documento"
			 exit_code ="10"
		 altro
cat -v $ backup_log_path / $ log_file_temp | -s posta "di riserva - $backup_source_ip - fatto Backup"  -R $ backup_email_from $ backup_email_to
fi
cat $ backup_log_path / $ log_file_temp >>  $backup_log_path / $ backup_log_file
rm $ backup_log_path / $ log_file_temp
fi
Elif [ $backup_service = sshsudoftp ]; poi
exit_code ="0"
	 log_file_temp = $ backup_log_file_ $(date +% Y_% M_% d_% H_% M_% S)
	 export SSHPASS = $ backup_source_pw
ionice -c 3 rsync -rptgoDzLKh --delete --exclude "*gli utenti / dati *" --escludere "*gli utenti / * / dati *"  --rsync-path ="sudo rsync" --rsh ="/usr / bin / sshpass -e ssh -o StrictHostKeyChecking = no -l $ backup_source_user " $backup_source_ip:$backup_source_path $ backup_dest_path --log-file = $ backup_log_path / $ log_file_temp --stats >> $backup_log_path / $ log_file_temp
	 Se [ ! $? -dare 0 ]; poi
		 eco "errore di backup - $?"
		 cat -v $ backup_log_path / $ backup_log_file | -s posta "di riserva - $backup_source_ip - Backup Errore - $?" -un "Da parte di: $backup_email_from" $backup_email_to
set -e
		 Uscita 1
	 altro
		 eco "Backup è ok"
		 Se [ ! $(grep -c "Numero di file creati: 0" $backup_log_path / $ log_file_temp) -eq 0 ]; poi
-s posta "di riserva - $backup_source_ip - fatto Backup - nessun documento" -R $ backup_email_from $ backup_email_to < $backup_log_path / $ log_file_temp
			  eco "copione - nessun documento"
			  exit_code ="10"
		  altro
cat -v $ backup_log_path / $ log_file_temp | -s posta "di riserva - $backup_source_ip - fatto Backup"  -R $ backup_email_from $ backup_email_to
fi
cat $ backup_log_path / $ log_file_temp >>  $backup_log_path / $ backup_log_file
rm $ backup_log_path / $ log_file_temp
fi

Elif [ $backup_service = smb ]; poi
        # il backup di montaggio
        mount -t cifs // $ backup_source_ip / $ backup_source_path $ backup_mount_path -o username = $ backup_source_user,password = $ backup_source_pw,ro,sec = NTLM

        Se [ ! $? -eq 0 ]; poi
                eco "Monte non è a posto - $?"
                eco " "  | -s posta "di riserva - $backup_source_ip - mount -t cifs // $ backup_source_ip / $ backup_source_path $ backup_mount_path non funziona" -un "Da parte di: $backup_email_from" $backup_email_to
                rm-rf "$backup_log_path / $ backup_log_file.lck"
                set -e
                Uscita 1
        altro
                eco "Mount va bene"
        fi


        # rsync
        exit_code ="0"
        log_file_temp = $ backup_log_file_ $(date +% Y_% M_% d_% H_% M_% S)
        rsync -rlptDvz $ backup_mount_path $ backup_dest_path --log-file = $ backup_log_path / $ log_file_temp --stats --chmod = u = rwx,g = rx,O = rx >> $backup_log_path / $ log_file_temp
        Se [ ! $? -dare 0 ]; poi
                eco "errore di backup - $?"
                cat -v $ backup_log_path / $ backup_log_file | -s posta "di riserva - $backup_source_ip - Backup Errore - $?" -un "Da parte di: $backup_email_from" $backup_email_to
                set -e
                Uscita 1
        altro
                eco "Backup è ok"
                                                                                                                     199,2-9       92%
        altro
                eco "Backup è ok"
                Se [ ! $(grep -c "Numero di file creati: 0" $backup_log_path / $ log_file_temp) -eq 0 ]; poi
                        cat -v $ backup_log_path / $ log_file_temp | -s posta "di riserva - $backup_source_ip - fatto Backup - nessun documento" -un "Da parte di: $backup_email_from" $backup_email_to
                        eco "copione - nessun documento"
                        exit_code ="10"
                altro
                        cat -v $ backup_log_path / $ log_file_temp | -s posta "di riserva - $backup_source_ip - fatto Backup" -un "Da parte di: $backup_email_from" $backup_email_to
                fi
                cat $ backup_log_path / $ log_file_temp >>  $backup_log_path / $ backup_log_file
                rm $ backup_log_path / $ log_file_temp
        fi
fi

# smontare

rm-rf "$backup_log_path / $ backup_log_file.lck"
exit $ exit_code

services-snapshots.sh

#!/bin / bash
set -e

Se [[ -z $ MODE ]]; poi
	eco "$MODE non specificata"
	Uscita 1
fi

Se [[ $UID -non 0 ]]; poi
	eco "Deve essere eseguito come root"
	Uscita 1
fi

Se [ -da "$1" ];poi
	eco "Non fonti impostate"
	Uscita 1
altro
	eco "Imposta origine"
	BACKUP_SOURCE_DIR = $ 1

fi

Se [ -da "$2" ];poi
	eco "nessun insieme di destinazione"
	Uscita 1
altro
	eco "obiettivo fissato"
	BACKUP_BASE_DIR = $ 2
fi

BACKUP_DIR_DAILY = ${BACKUP_BASE_DIR}/quotidiano
BACKUP_DIR_WEEKLY = ${BACKUP_BASE_DIR}/settimanalmente
BACKUP_DIR_MONTHLY = ${BACKUP_BASE_DIR}/mensile
BACKUP_DIR_YEARLY = ${BACKUP_BASE_DIR}/annuale

Se [ ! -d "$BACKUP_DIR_DAILY" ]; poi
	eco "cartella di backup non esiste"
	mkdir -p $ BACKUP_DIR_DAILY
chmod 740 $BACKUP_DIR_DAILY
	eco "cartella di backup creata"
altro
	eco "cartella di backup esiste"
fi
Se [ ! -d "$BACKUP_DIR_WEEKLY" ]; poi
	eco "cartella di backup non esiste"
	mkdir -p $ BACKUP_DIR_WEEKLY
chmod 740 $BACKUP_DIR_WEEKLY
	eco "cartella di backup creata"
altro
	eco "cartella di backup esiste"
fi
Se [ ! -d "$BACKUP_DIR_MONTHLY" ]; poi
	eco "cartella di backup non esiste"
	mkdir -p $ BACKUP_DIR_MONTHLY
chmod 740 $BACKUP_DIR_MONTHLY
	eco "cartella di backup creata"
altro
	eco "cartella di backup esiste"
fi
Se [ ! -d "$BACKUP_DIR_YEARLY" ]; poi
	eco "cartella di backup non esiste"
	mkdir -p $ BACKUP_DIR_YEARLY
chmod 740 $BACKUP_DIR_YEARLY
	eco "cartella di backup creata"
altro
	eco "cartella di backup esiste"
fi




NUM_FILES_TO_KEEP_DAILY = 10
NUM_FILES_TO_KEEP_WEEKLY = 20
NUM_FILES_TO_KEEP_MONTHLY = 12
NUM_FILES_TO_KEEP_YEARLY = 10

Se [[ $MODE = "QUOTIDIANO" ]]; poi
BACKUP_DIR = $ BACKUP_DIR_DAILY
NUM_FILES_TO_KEEP = $ NUM_FILES_TO_KEEP_DAILY
Elif [[ $MODE = "SETTIMANALMENTE" ]]; poi
BACKUP_DIR = $ BACKUP_DIR_WEEKLY
NUM_FILES_TO_KEEP = $ NUM_FILES_TO_KEEP_WEEKLY
Elif [[ $MODE = "MENSILE" ]]; poi
BACKUP_DIR = $ BACKUP_DIR_MONTHLY
NUM_FILES_TO_KEEP = $ NUM_FILES_TO_KEEP_MONTHLY
Elif [[ $MODE = "ANNUALE" ]]; poi
BACKUP_DIR = $ BACKUP_DIR_YEARLY
NUM_FILES_TO_KEEP = $ NUM_FILES_TO_KEEP_YEARLY
altro
	eco "I valori disponibili $ MODE sono: QUOTIDIANO, MENSILE, SETTIMANALMENTE, ANNUALE"
	Uscita 1
fi

NUM_FILES_TO_KEEP = $(( $NUM_FILES_TO_KEEP + 1 ))

_backup () {
	/sbin / btrfs sottovolume istantanea -r $ BACKUP_SOURCE_DIR ${BACKUP_DIR}/backup-$(date +% Y-% m-% d)
}

_pulire () {
	per il file in $(ls -rt $ BACKUP_DIR | tail -n  +${NUM_FILES_TO_KEEP} ); fare
btrfs sudo sottovolume cancellare ${BACKUP_DIR}/$file
	fatto
}

_backup
_pulire