Написал скрипт для резервного копирования общей папки 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 дней, которые будут удалены.
Поделиться ссылкой: