Задача: бэкапить файлы с сервера через ssh
- авторизация SSH без пароля
12345ssh-keygen -t rsassh-copy-id -i ~/.ssh/id_rsa.pub username@10.0.0.2ssh username@10.0.0.2chmod 600 ~/.ssh/authorized_keysexit
Выполнять скрипт будем от рута, поэтому копируем ключи
123cp ~/.ssh/id_rsa /root/.ssh/id_rsacp ~/.ssh/id_rsa.pub /root/.ssh/id_rsa.pubcp ~/.ssh/known_hosts /root/.ssh/known_hosts - Ставим msmtp для отправки писем админу (если не стоит smtp-сервер).
1sudo apt-get install msmtp && sudo touch /etc/msmtprc && sudo nano /etc/msmtprc
12345678910account defaulthost smtp.yandex.ruauth loginport 587from email@yandex.ruuser email@yandex.rupassword userpasstls ontls_certcheck offlogfile /var/log/msmtp.log - Создаем сам скрипт. Отправку емейла и условия выполнения пока не доделал
1touch /root/backup.sh && nano /root/backup.sh
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879#!/bin/sh#Скрипт бэкапа с использованием rsync на хардлинках# $1 - Путь откуда делать бэкап# $2 - корень каталога с бэкапами относительно корневого раздела без слеша в конце# запускать так sh backup.sh "/server1" "root@10.0.0.1:/data/a root@10.0.0.2:/data/b"#корень каталога с бэкапами относительно корневого раздела без слеша в концеbackup_folder_main=$1#Определяем переменные из аргуметов переданных скриптуkatalog_dla_backupa_from=$2#процент заполнения дискаprocent_zapolnenia_diska="75"#точка монтирования раздела с бэкапами без слэша в концеtochka_montirovania_razdela="/mnt/backup"#лог-файлlogfile="/var/log/backup_rsync"#отправка письма - предварительно настроить msmtpemailfrom="email@yandex.ru"emailto="admin@yandex.ru"if [ "$#" -eq 2 ]then#пишем в лог старт бэкапа. один знак > значит, что лог будет перезаписанecho "==============================" > $logfileecho $(date +%d.%m.%Y-%H:%M:%S) "Старт бэкапа с параметрами:" >> $logfile#Определяем процент занятого места на диске по точке монтирования этого дискаrealny_procent_zapolnenia_diska=$(df -h | grep $tochka_montirovania_razdela | awk '{print $5}' | sed 's/.$//')#В случае если реальный процент больше или равен заданному значению удаляем лишние файлыwhile [ "$realny_procent_zapolnenia_diska" -ge "$procent_zapolnenia_diska" ]do#Определяем дату самого старого файла путем обратной сортировки по имениsamy_stary_katalog=$(ls -tF $tochka_montirovania_razdela$backup_folder_main | grep -e ./ | tail -n1)#удаляем папкуrm -rf $tochka_montirovania_razdela$backup_folder_main/$samy_stary_katalog#пишем в логecho $(date +%d.%m.%Y-%H:%M:%S) "Удален каталог" $samy_stary_katalog >> $logfile#Определяем процент занятого места на диске по точке монтирования этого дискаrealny_procent_zapolnenia_diska=$(df -h | grep $tochka_montirovania_razdela | awk '{print $5}' | sed 's/.$//')done#определяем имя последней резервной копииposlednij_backup=$(ls -tF $tochka_montirovania_razdela$backup_folder_main | grep -e ./ | head -n1)#определяем каталог текущего бэкапаbackup_tekishij=$(date +%Y-%m-%d)#пишем в лог старт rsyncecho $(date +%d.%m.%Y-%H:%M:%S) "старт rsync" >> $logfile#бэкапимrsync -av --force --ignore-errors --delete --link-dest=$tochka_montirovania_razdela$backup_folder_main/$poslednij_backup $katalog_dla_backupa_from $tochka_montirovania_razdela$backup_folder_main/$backup_tekishij >> $logfile#пишем в лог конец rsyncecho $(date +%d.%m.%Y-%H:%M:%S) "стоп rsync" >> $logfile#отправляем емейл(cat <<EOFFrom: backup-$backup_folder_main <$emailfrom>To: admin <$emailto>Subject: Backup-OKScript otrabotal Скрипт отработалEOF) | msmtp -tfi
- Ставим на крон от рута
1sudo crontab -e
10 21 * * * flock -n /tmp/backup.sh-lock /root/backup.sh "/server1" "username@10.0.0.2:/data/1"