Bash скрипт для резервного копирования общих папок Windows

Написал скрипт для резервного копирования общей папки windows. Работает на bash. Из зависимостей — smbclient, cifs-utils, rsync. Так же — для уведомления о результате копирования используется скрипт уведомлений в telegram который я выложил вот тут.

Обязательные параметры:

  • -s  | —server  — адрес сервера или компьютера где расположена общая папка
  • -f   | —folder  —  имя общей папки которую надо скопировать
  • -m | —mount — имя директории на сервере на котором запускается этот скрипт, куда будет подключена общая папка

если параметр m не указан, то он принимает значение такое же как у параметра f. Однако будьте осторожны, имя директории для монтирования лучше задавать латиницей, и уж тем более без специальных символов. Поэтому не все пути до общих папок — подойдут в качестве имени директории для монтирования.

используемые переменные:

  • BACKUP_DATE — дата и время выполнения бекапа
  • BACKUP_PATH — путь до директории с бекапами
  • CRED — строка с логином-паролем для доступа к общей папке. Если в нее можно зайти как гость — то username ставим равным guest. Пример строки: username=mirivlad@domain.com,password=some_password,iocharset=utf8,file_mode=0777,dir_mode=0777,vers=1.0
  • ERRLOG — путь до файла с логами.
  • FAIL_MSG — сообщение о неудаче
  • OK_MSG — сообщение об успехе

Ну и далее сам текст скрипта:

#!/bin/bash
while [[ "$#" -gt 0 ]]
  do
    case $1 in
      -s|--server) SMB_SERV="$2"; shift;;
      -f|--folder) BACKUP_DIR="$2"; shift;;
      -m|--mount) MOUNTDIR="$2"; shift;;
    esac
    shift
done
if [ -z "${MOUNTDIR}" ]; then

    MOUNTDIR=$BACKUP_DIR

fi
BACKUP_DATE=$(date "+%Y%m%d-%H-%M-%S")
BACKUP_PATH='/back'
CRED="username=mirivlad@domain.com,password=some_password,iocharset=utf8,file_mode=0777,dir_mode=0777,vers=1.0"
ERRLOG=$BACKUP_PATH/$MOUNTDIR/$BACKUP_DATE/err.log
FAIL_MSG="$SMB_SERV/$BACKUP_DIR
❌ Неудачное копирование:"
OK_MSG="$SMB_SERV/$BACKUP_DIR 
✅ Копирование выполнено успешно"
mkdir -p $BACKUP_PATH/$MOUNTDIR
mkdir -p /root/temp_backup/$MOUNTDIR
mkdir -p $BACKUP_PATH/$MOUNTDIR/$BACKUP_DATE

touch $ERRLOG

mount -t cifs  -o $CRED //$SMB_SERV/$BACKUP_DIR /root/temp_backup/$MOUNTDIR

rsync -av --progress /root/temp_backup/$MOUNTDIR/ $BACKUP_PATH/$MOUNTDIR/$BACKUP_DATE/ 2>$ERRLOG

if [ $? -eq 0 ]; then
        /root/bin/telegram.sh -t "$OK_MSG"
else
        if [ "$(cat $ERRLOG | wc -l)" -lt "10" ];then
                ERR_MSG=$(cat $ERRLOG)
                /root/bin/telegram.sh -t "$FAIL_MSG: 
$ERR_MSG"
        else
                /root/bin/telegram.sh -t "$FAIL_MSG"
                /root/bin/telegram.sh -f "$ERRLOG"
        fi
fi
rm $ERRLOG

umount -t cifs /root/temp_backup/$MOUNTDIR

 

Пример запуска скрипта:

/root/bin/smb_copy.sh -s 192.168.1.5 -f 'общ' -m obsh

Если требуется скопировать какую-то директорию с windows-ПК не имеющего общих папок, но у вас есть ActiveDirectory в сети, и права админа, то сделать это можно так:

/root/bin/smb_copy.sh -s 192.168.3.125 -f 'C$/email' -m email_on_125

Все это прекрасно ставится в cron совместно с командой поиска и удаления старых папок/файлов:

0 19 */5 * * /root/bin/smb_copy.sh -s 192.168.1.11 -f doc; find /back/doc/* -type d -mtime +11 -exec rm {} \;

В этом примере — мы поставили в cron задание на копирование общей папки doc с сервера 192.168.1.11 которое будет выполняться в 19 часов 00 минут каждые 5 дней. После выполнения копирования в директории /back/doc/ будет произведен поиск всех файлов и папок старше 11 дней, которые будут удалены.
Поделиться ссылкой:

5 1 голос
Article Rating
Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии