Shell Backup-Skript – Windows-SMB / Linux-Server

bereiten

  • Kopieren Sie alle Dateien in einem Ordner
  • ändern backup-start.sh mit Ihrem Weg und configs
  • machen eine Btrfs-Partition
  • ein Teilvolumen für den Backup-Pfad erstellen
  • schaffen einen Cronjob

Anfang

backup-start.sh täglich
backup-start.sh wöchentlich

Backup-Modi

  • smb
  • sshs
  • sshnosymlink
  • sshsudoftp

backup-start.sh

#!/bin / bash
# überprüfen Sie die Backup-Skript, wenn sein Lauf und wenn ja, dann für einen Schnappschuss calc
script_name = / home / backup / backup-script.sh
email_admin=mail1@mail.de,mail2@mail.de
backup_path = / srv / backup / done
snapshot_path = / srv / backup / Schnappschüsse / Backup- $(date +% Y-% m-% d-% H-% M)
snapshot_script = / home / eit / backup / services-snapshots.sh

## Skript Start

ob [ -von "$1" ];dann
 Echo "kein Ziel gesetzt"
 Ausfahrt 1
sonst
 #Echo "Ziel festlegen"
 backup_mode = $ 1
fi

## Funktion für die errpr Codes
check_error(){
 ob [ "$1" -geben "100" ]; dann
 Echo "Anfang - Sicherung läuft noch"
 Ausfahrt 1
 fi
 ob [ "$1" -eq "10" ]; dann
 Echo "Anfang - Sicherung getan - keine Dateien"
 MODE = $ backup_mode $ snapshot_script $ backup_local_path / $ Server $ snapshot_local_path / $ Server
 sonst
 ob [ "$1" -eq "0" ]; dann
 Echo "Anfang - Sicherung getan - mit Dateien"
 MODE = $ backup_mode $ snapshot_script $ backup_local_path / $ Server $ snapshot_local_path / $ Server
 fi
 fi
}

script_start(){
 ob [ ! -d "$backup_local_path / $ Server" ]; dann
 Echo "Backup-Ordner nicht vorhanden"
 Btrfs Subvolume $ backup_local_path erstellen / $ Server
 chmod 740 $backup_local_path / $ Server
 Echo "Backup-Ordner erstellt"
 sonst
 Echo "Backup-Ordner vorhanden"
 fi
}

##
# laufen Backup-Skript
##

server = mysvwe1
script_start
sh $ script_name $ email_admin $ server / path / to / backup / data $ password backup_local_path ssh username
error_now = $?
check_error $ error_now

Ausfahrt 0

backup-script.sh

#!/bin / bash
#
# Thomas Mosandl - 2014-11-14
#
# apt-get install CIFS-utils sendmail-bin
# send~~POS=TRUNC-Config
#
# definieren Parameter #!/bin / sh
# definieren parameterss
## variablen
## 1. Mail an
## 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"

# Ende Config

Echo "Sicherung starten - $backup_source_ip"

# vaiable Scheck
wenn [ -von "$1" ];dann
        Echo "mail set config"
        backup_email_to ="$backup_email_to_config"
sonst
        Echo "Mail auf Parameter"
        backup_email_to = $ 1
fi
# überprüfen iSCSI-Ziel


#ping -q -c $ backup_check_client_ping $ backup_iscsi_target_1 > /dev / null
#ob [ ! $? -eq 0 ]; dann
#	Echo "ISCSI Ping nicht availible"
#	Echo " "  | mail -s "Sicherungskopie - ISCSI - Ping funktioniert nicht" -ein "Von: $backup_email_from" $backup_email_to
#	Ausfahrt 1
#sonst
#	#ob [ $(iscsiadm -m-Sitzung | grep -c "$backup_iscsi_target_1") -eq 0 ]; dann
	#	Echo "ISCSI Berg nicht availible"
	#	Echo " "  | mail -s "Sicherungskopie - ISCSI - Mount funktioniert nicht" -ein "Von: $backup_email_from" $backup_email_to
	#	Ausfahrt 1
	#sonst
#		Echo "ISCSI ist in Ordnung"
	#sein
#fi

#192.168.144.167
# überprüfen, ob Backup ausgeführt wird
ps aux > /tmp / temp.txt
ob [ $(Katze /tmp/temp.txt  | grep -c "ssh -o StrictHostKeyChecking = no -l")  -gt 0 ]; dann
Echo "Sicherung war defekt oder nicht ausgeführt"
	ob [ -f "$backup_log_path / $ backup_log_file.lck" ]; dann
rm -rf "$backup_log_path / $ backup_log_file.lck"
	fi
fi
rm -rf /tmp/temp.txt

ob [ -f "$backup_log_path / $ backup_log_file.lck" ]; dann
Echo " "  | mail -s "Sicherungskopie - $backup_source_ip - Backup ist immer noch läuft"  -r $ backup_email_from $ backup_email_to
Echo "Skript - Backup ausgeführt wird"
		set -e
		Ausfahrt 100
sonst
Echo "Skript - Sicherung nicht noch läuft"
	berühren "$backup_log_path / $ backup_log_file.lck"
fi

# überprüfen, ob log in logrotate ist

ob [ $(grep -c "$backup_log_path / $ backup_log_file" /etc / logrotate.d / rsyslog)  -eq 1 ]; dann
Echo "Skript - rsyslog gesetzt"
sonst
Echo "$backup_log_path / $ backup_log_file {}" >> /etc / logrotate.d / rsyslog
Echo "Skript - rsyslog erstellt"
fi

#
ob [ ! $(montieren | grep -c "/Medien / data0 / srv / Backup-Typ Btrfs (rw)")  -eq 0 ]; dann
Echo "Lagerung nicht montiert"
	Ausfahrt 11
	Echo " "  | mail -s "Sicherungskopie - Lagerung nicht montiert"  -r $ backup_email_from $ backup_email_to
sonst
Echo "Lagerung montiert"
fi

# Ordner erstellen

# überprüfen Backup-Verzeichnis
ob [ ! -d "$backup_dest_path" ]; dann
      Echo "Backup-Ordner nicht vorhanden"
      mkdir -p $ backup_dest_path
      chmod 740 $backup_dest_path
      Echo "Backup-Ordner erstellt"
sonst
      Echo "Backup-Ordner vorhanden"
fi


ob [ ! -d "$backup_log_path" ]; dann
      Echo "Backup-Protokollordner nicht vorhanden"
      mkdir -p $ backup_log_path
      Echo "Backup-Protokollordner erstellt"
sonst
      Echo "Backup-Protokollordner vorhanden"
fi





# nslookup Scheck
nslookup $ backup_source_ip > /dev / null
ob [ ! $? -eq 0 ]; dann
Echo "DNS funktioniert nicht für $ backup_source_ip"
	Echo " "  | mail -s "Sicherungskopie - $backup_source_ip - nslookup funktioniert nicht für $ backup_source_ip"  -r $ backup_email_from $ backup_email_to
rm -rf "$backup_log_path / $ backup_log_file.lck"
	set -e
	Ausfahrt 1
sonst
Echo "DNS ist in Ordnung"
fi


# Ping-Check
ob [ ! $backup_source_ip = "server.de" ]; dann
ping -q -c $ backup_check_client_ping $ backup_source_ip > /dev / null
		ob [ ! $? -eq 0 ]; dann
Echo "PING funktioniert nicht für $ backup_source_ip"
		Echo " "  | mail -s "Sicherungskopie - $backup_source_ip - ping $ backup_source_ip nicht funktioniert"  -r $ backup_email_from $ backup_email_to
rm -rf "$backup_log_path / $ backup_log_file.lck"
		set -e
		Ausfahrt 1
	sonst
Echo "Ping ist in Ordnung"
	sein
sein

# rsync
echo $ backup_service
ob [ $backup_service = ssh ]; dann
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
	ob [ ! $? -geben 0 ]; dann
Echo "Backup-Fehler - $?"
		Katze -v $ backup_log_path / $ backup_log_file | mail -s "Sicherungskopie - $backup_source_ip - Fehler-Backup - $?" -ein "Von: $backup_email_from" $backup_email_to
set -e
		Ausfahrt 1
	sonst
Echo "Backup ist in Ordnung"
		ob [ ! $(grep -c "Anzahl der erstellten Dateien: 0" $backup_log_path / $ log_file_temp) -eq 0 ]; dann
mail -s "Sicherungskopie - $backup_source_ip - Fertig-Backup - keine Dateien" -r $ backup_email_from $ backup_email_to < $backup_log_path / $ log_file_temp
Echo "Skript - keine Dateien"
			 exit_code ="10"
		 sonst
Katze -v $ backup_log_path / $ log_file_temp | mail -s "Sicherungskopie - $backup_source_ip - Fertig-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 ]; dann
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
	 ob [ ! $? -geben 0 ]; dann
Echo "Backup-Fehler - $?"
		 Katze -v $ backup_log_path / $ backup_log_file | mail -s "Sicherungskopie - $backup_source_ip - Fehler-Backup - $?" -ein "Von: $backup_email_from" $backup_email_to
set -e
		 Ausfahrt 1
	 sonst
Echo "Backup ist in Ordnung"
		 ob [ ! $(grep -c "Anzahl der erstellten Dateien: 0" $backup_log_path / $ log_file_temp) -eq 0 ]; dann
mail -s "Sicherungskopie - $backup_source_ip - Fertig-Backup - keine Dateien" -r $ backup_email_from $ backup_email_to < $backup_log_path / $ log_file_temp
Echo "Skript - keine Dateien"
			 exit_code ="10"
		 sonst
Katze -v $ backup_log_path / $ log_file_temp | mail -s "Sicherungskopie - $backup_source_ip - Fertig-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 ]; dann
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 "*Benutzer / Daten *" --ausschließen "*Benutzer / * / Daten *"  --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
	 ob [ ! $? -geben 0 ]; dann
Echo "Backup-Fehler - $?"
		 Katze -v $ backup_log_path / $ backup_log_file | mail -s "Sicherungskopie - $backup_source_ip - Fehler-Backup - $?" -ein "Von: $backup_email_from" $backup_email_to
set -e
		 Ausfahrt 1
	 sonst
Echo "Backup ist in Ordnung"
		 ob [ ! $(grep -c "Anzahl der erstellten Dateien: 0" $backup_log_path / $ log_file_temp) -eq 0 ]; dann
mail -s "Sicherungskopie - $backup_source_ip - Fertig-Backup - keine Dateien" -r $ backup_email_from $ backup_email_to < $backup_log_path / $ log_file_temp
Echo "Skript - keine Dateien"
			  exit_code ="10"
		  sonst
Katze -v $ backup_log_path / $ log_file_temp | mail -s "Sicherungskopie - $backup_source_ip - Fertig-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 ]; dann
        # Mount-Backup
        mount -t cifs // $ backup_source_ip / $ backup_source_path $ backup_mount_path -o username = $ backup_source_user,Passwort = $ backup_source_pw,ro,sec = ntlm

        ob [ ! $? -eq 0 ]; dann
                Echo "Berg ist nicht in Ordnung - $?"
                Echo " "  | mail -s "Sicherungskopie - $backup_source_ip - mount -t cifs // $ backup_source_ip / $ backup_source_path $ backup_mount_path nicht funktioniert" -ein "Von: $backup_email_from" $backup_email_to
                rm -rf "$backup_log_path / $ backup_log_file.lck"
                set -e
                Ausfahrt 1
        sonst
                Echo "Berg ist in Ordnung"
        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
        ob [ ! $? -geben 0 ]; dann
                Echo "Backup-Fehler - $?"
                Katze -v $ backup_log_path / $ backup_log_file | mail -s "Sicherungskopie - $backup_source_ip - Fehler-Backup - $?" -ein "Von: $backup_email_from" $backup_email_to
                set -e
                Ausfahrt 1
        sonst
                Echo "Backup ist in Ordnung"
                                                                                                                     199,2-9       92%
        sonst
                Echo "Backup ist in Ordnung"
                ob [ ! $(grep -c "Anzahl der erstellten Dateien: 0" $backup_log_path / $ log_file_temp) -eq 0 ]; dann
                        Katze -v $ backup_log_path / $ log_file_temp | mail -s "Sicherungskopie - $backup_source_ip - Fertig-Backup - keine Dateien" -ein "Von: $backup_email_from" $backup_email_to
                        Echo "Skript - keine Dateien"
                        exit_code ="10"
                sonst
                        Katze -v $ backup_log_path / $ log_file_temp | mail -s "Sicherungskopie - $backup_source_ip - Fertig-Backup" -ein "Von: $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

# aushängen

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

services-snapshots.sh

#!/bin / bash
set -e

ob [[ -z $ MODE ]]; dann
Echo "$MODE nicht angegeben"
	Ausfahrt 1
fi

ob [[ $UID -nicht 0 ]]; dann
Echo "Muss als root ausgeführt werden"
	Ausfahrt 1
fi

ob [ -von "$1" ];dann
Echo "nicht Quellen gesetzt"
	Ausfahrt 1
sonst
Echo "Set Source"
	BACKUP_SOURCE_DIR = $ 1

fi

ob [ -von "$2" ];dann
Echo "kein Ziel gesetzt"
	Ausfahrt 1
sonst
Echo "Ziel festlegen"
	BACKUP_BASE_DIR = $ 2
fi

BACKUP_DIR_DAILY = ${BACKUP_BASE_DIR}/täglich
BACKUP_DIR_WEEKLY = ${BACKUP_BASE_DIR}/wöchentlich
BACKUP_DIR_MONTHLY = ${BACKUP_BASE_DIR}/monatlich
BACKUP_DIR_YEARLY = ${BACKUP_BASE_DIR}/jährlich

ob [ ! -d "$BACKUP_DIR_DAILY" ]; dann
Echo "Backup-Ordner nicht vorhanden"
	mkdir -p $ BACKUP_DIR_DAILY
chmod 740 $BACKUP_DIR_DAILY
Echo "Backup-Ordner erstellt"
sonst
Echo "Backup-Ordner vorhanden"
fi
ob [ ! -d "$BACKUP_DIR_WEEKLY" ]; dann
Echo "Backup-Ordner nicht vorhanden"
	mkdir -p $ BACKUP_DIR_WEEKLY
chmod 740 $BACKUP_DIR_WEEKLY
Echo "Backup-Ordner erstellt"
sonst
Echo "Backup-Ordner vorhanden"
fi
ob [ ! -d "$BACKUP_DIR_MONTHLY" ]; dann
Echo "Backup-Ordner nicht vorhanden"
	mkdir -p $ BACKUP_DIR_MONTHLY
chmod 740 $BACKUP_DIR_MONTHLY
Echo "Backup-Ordner erstellt"
sonst
Echo "Backup-Ordner vorhanden"
fi
ob [ ! -d "$BACKUP_DIR_YEARLY" ]; dann
Echo "Backup-Ordner nicht vorhanden"
	mkdir -p $ BACKUP_DIR_YEARLY
chmod 740 $BACKUP_DIR_YEARLY
Echo "Backup-Ordner erstellt"
sonst
Echo "Backup-Ordner vorhanden"
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

ob [[ $MODE = "TÄGLICH" ]]; dann
BACKUP_DIR = $ BACKUP_DIR_DAILY
NUM_FILES_TO_KEEP = $ NUM_FILES_TO_KEEP_DAILY
Elif [[ $MODE = "WÖCHENTLICH" ]]; dann
BACKUP_DIR = $ BACKUP_DIR_WEEKLY
NUM_FILES_TO_KEEP = $ NUM_FILES_TO_KEEP_WEEKLY
Elif [[ $MODE = "MONATLICH" ]]; dann
BACKUP_DIR = $ BACKUP_DIR_MONTHLY
NUM_FILES_TO_KEEP = $ NUM_FILES_TO_KEEP_MONTHLY
Elif [[ $MODE = "JÄHRLICH" ]]; dann
BACKUP_DIR = $ BACKUP_DIR_YEARLY
NUM_FILES_TO_KEEP = $ NUM_FILES_TO_KEEP_YEARLY
sonst
Echo "verfügbar $ MODE Werte: TÄGLICH, MONATLICH, WÖCHENTLICH, JÄHRLICH"
	Ausfahrt 1
fi

NUM_FILES_TO_KEEP = $(( $NUM_FILES_TO_KEEP + 1 ))

_backup () {
	/sbin / Btrfs Subvolume Snapshot -r $ BACKUP_SOURCE_DIR ${BACKUP_DIR}/Backup- $(date +% Y-% m-% d)
}

_Aufräumen () {
	für Datei in $(ls -rt $ BACKUP_DIR | tail -n  +${NUM_FILES_TO_KEEP} ); machen
sudo Btrfs Subvolume löschen ${BACKUP_DIR}/$Datei
	erledigt
}

_backup
_Aufräumen